RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 2. NDB API

Резюме

Эта глава содержит информацию о API NDB, который используется, чтобы написать приложения, работающие с данными в NDB.

2.1. Начало работы с NDB API

Эта секция обсуждает приготовления, необходимые для написания и компилирования приложения API NDB.

2.1.1. Компилирование и компоновка программ NDB API

Резюме

Эта секция предоставляет информацию о компилировании и компоновке приложения NDB API, включая требования и варианты компоновщика и компилятора.

2.1.1.1. Общие требования

Чтобы использовать API NDB с MySQL, вы должны иметь библиотеку клиента libndbclient и ее связанные заголовочные файлы, они устанавливаются вместе с обычными библиотеками клиента MySQL и заголовками. Они автоматически устанавливаются, когда вы собираете MySQL с опцией -DWITH_NDBCLUSTER=ON или используете двоичный пакет, который поддерживает NDB.

Это руководство предназначено для использования с MySQL NDB Cluster 7.2 и выше.

2.1.1.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.

2.1.1.3. Опции компоновки

Приложения 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"

2.1.1.4. Применение Autotools

Это часто быстрее и более просто использовать автоинструменты 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
])

2.1.2. Соединение с кластером

Резюме

Эта секция показывает подключение к NDB Cluster.

2.1.2.1. Включаемые файлы

Приложения NDB API требуют один или больше включаемых файлов:

  • Приложения, получающие доступ к данным NDB Cluster через NDB API, должны включать файл NdbApi.hpp.

  • Приложения, использующие клиентский MySQL API, а также API NDB, должны также включать mysql.h (в дополнение к NdbApi.hpp).

  • Для приложений, которые используют функции управления NDB Cluster из MGM API нужен файл mgmapi.h.

2.1.2.2. Инициализация и парковка API

Перед использованием 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(), чтобы не разделять такие ресурсы, как файлы и связи между процессами.

2.1.2.3. Установление связи

Чтобы установить связь с сервером, необходимо создать экземпляр 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;
}

2.1.3. Отображение имен объектов базы данных MySQL и типов к NDB

Резюме

Следующие две секции обсуждают обозначение и другие соглашения, сопровождаемые API NDB относительно объектов базы данных MySQL, а также обработку типов данных MySQL в приложениях API NDB.

2.1.3.1. Имена объектов базы данных 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.

2.1.3.2. Обработка NDB API типов данных 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

Точность Надо байтДиапазон
00Нет
110-9
210-99
320-999
420-9999
530-99999
630-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.

2.2. Иерархия классов NDB API

Эта секция предоставляет иерархический список всех классов, интерфейсов и структур, выставленных API NDB.

2.3. Классы, интерфейсы и структуры NDB API

Эта секция предоставляет подробный список всех классов, интерфейсов и структур, определенных в NDB API.

Каждый листинг включает следующую информацию:

  • Описание и цель класса, интерфейса или структуры.

  • Указатели, когда это применимо, к родительским и дочерним классам.

  • Подробные списки всех публичных членов, включая описания всех параметров методов и типов значений.

Класс, интерфейс и описания структуры обеспечиваются в алфавитном порядке. Для иерархического листинга посмотрите раздел 2.2.

2.3.1. Структура AutoGrowSpecification

Резюме

Эта секция описывает структуру 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 ???

2.3.2. Класс Column

Резюме

Этот класс представляет колонку в таблице 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

2.3.2.1. Column::ArrayType

Резюме

Этот тип описывает внутренний формат признака Column.

Описание. Формат хранения признака может быть фиксированным или переменным.

Возможные значения. Возможные значения показывают с описаниями в следующей таблице:

Таблица 2.8.

Имя Описание
ArrayTypeFixed сохраненный как постоянное число байтов
ArrayTypeShortVar сохраненный как переменное число байтов, дополнительно 1 байт
ArrayTypeMediumVar сохраненный как переменное число байтов, дополнительно 2 байта

Фиксированный формат хранения быстрее, но также обычно требует большего количества пространства, чем переменный формат. По умолчанию ArrayTypeShortVar для типов Var* и ArrayTypeFixed для остальных. Этого обычно хватает.

2.3.2.2. Column::StorageType

Резюме

Этот тип описывает тип хранения, используемый объектом Column.

Описание. Тип хранения, используемый для данной колонки, может быть в памяти или на диске. Колонки, сохраненные на диске, означают, что меньше RAM требуется в целом, но такие колонки не могут быть внесены в индекс и потенциально намного медленнее по доступу. Умолчание StorageTypeMemory.

Возможные значения.

Таблица 2.9.

Имя Описание
StorageTypeMemory Сохраните колонку в памяти
StorageTypeDisk Сохраните колонку на диске

2.3.2.3. Column::Type

Резюме

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.

2.3.2.4. Методы Column

Резюме

Эта секция документирует публичные методы класса Column.

Оператор присваивания (=) перегружен для этого класса, так, чтобы он всегда выполнил глубокую копию.

Как с другими объектами базы данных, создание объекта Column и изменения признака существующих столбцов, сделанных, используя API NDB, невидимы из MySQL. Например, если вы изменяете тип данных с использованием колонки Column::setType(), MySQL расценит тип колонки, как являющейся неизменным. Единственное исключение к этому правилу относительно столбцов: можно поменять имя существующего столбца с использованием Column::setName().

Также помните, что API NDB обращается с именами столбцов чувствительным к регистру способом.

2.3.2.4.1. Column Constructor

Описание. Можно создать новый Column или скопировать существующий, используя конструктор класса.

Column, созданный с использованием API NDB, невидим сервером MySQL.

API NDB обращается с именами столбцов чувствительным к регистру способом. Например, если вы создадите колонку, названную myColumn, вы не будете в состоянии получить доступ к ней позже, используя имя Mycolumn. Можно уменьшить возможность для ошибки, назвав все колонки последовательно, используя только какой-то один регистр.

Сигнатура. Можно создать любой новый экземпляр класс Column или скопировать существующий объект Column:

  • Конструктор для нового Column:

    Column
    (
      const char* name = ""
    )
    
  • Конструктор копии:

    Column
    (
      const Column& column
    )
    

Параметры. Создавая новый экземпляр Column, конструктор берет отдельный аргумент, который является названием новой колонки, которая будет создана. Конструктор копии также берет один параметр, в этом случае, это ссылка на копируемый экземпляр Column.

Возвращаемое значение. Объект Column .

Деструктор. Деструктор класса Column не берет аргументов.

2.3.2.4.2. Column::equal()

Описание. Этот метод используется, чтобы сравнить Column с другим, чтобы определить, одинаковы ли два объекта Column.

Сигнатура.

bool equal
(
  const Column& column
) const

Параметры. equal() берет единственный параметр, ссылку на экземпляр Column.

Возвращаемое значение. true, если сравниваемые колонки равны, иначе false.

2.3.2.4.3. Column::getArrayType()

Описание. Этот метод получает тип массива колонки.

Сигнатура.

ArrayType getArrayType
(
  void
) const

Параметры. Нет.

Возвращаемое значение. ArrayType, см. раздел 2.3.2.1.

2.3.2.4.4. Column::getCharset()

Описание. Это вернет набор символов столбца.

Этот метод применим только к столбецм, чей 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.

2.3.2.4.5. Column::getColumnNo()

Описание. Этот метод получает порядковый номер колонки в рамках ее таблицы или индекса. Если столбец часть индекса (такой как тогда, когда возвращено getColumn()), это отображено к его положению в том индексе, а не в таблице, содержащей индекс.

Сигнатура.

int getColumnNo
(
void
) const

Параметры. Нет.

Возвращаемое значение. Номер столбца как integer.

2.3.2.4.6. Column::getDefaultValue()

Описание. Получает данные о значении столбца по умолчанию.

Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по умолчанию, надо использовать Table::hasDefaultValues().

Сигнатура.

const void* getDefaultValue
(
  unsigned int* len = 0
) const

Параметры. len содержит длину значения по умолчанию или 0, если столбец может быть null или не имеет никакого значения по умолчанию.

Возвращаемое значение. Данные о значении по умолчанию.

2.3.2.4.7. Column::getInlineSize()

Описание. Этот метод получает действующий размер BLOB то есть, число начальных байтов, чтобы сохранить в признаке blob таблицы. Эта часть обычно находится в оперативной памяти и может быть внесена в индекс.

Этот метод применим только к столбцам BLOB.

Сигнатура.

int getInlineSize
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Действующий размер колонки BLOB как integer.

2.3.2.4.8. Column::getLength()

Описание. Этот метод получает длину колонки. Это длина массива для колонки или максимальная длина для множества переменной длины.

Сигнатура.

int getLength
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Максимальная длина массива колонки как integer.

2.3.2.4.9. Column::getName()

Описание. Этот метод возвращает название колонки, для которой его вызывают.

Сигнатура.

const char* getName
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Название колонки.

2.3.2.4.10. Column::getNullable()

Описание. Этот метод используется, чтобы определить, может ли столбец быть установлен в NULL.

Сигнатура.

bool getNullable
(
  void
) const

Параметры. Нет.

Возвращаемое значение. true, если столбец может быть установлен в NULL, иначе false.

2.3.2.4.11. Column::getPartitionKey()

Описание. Этот метод используется, чтобы проверить, является ли столбец частью ключа разделения таблицы.

Ключ разделения это ряд признаков, используемых, чтобы распределить кортежи на узлы данных. Этот ключ это хеш-функция, определенная для NDB.

Примером, где это было бы полезно, является применение отслеживания ресурсов, включающее многократные склады и регионы, где могло бы быть хорошо использовать ID склада и id округа как ключ разделения. Это поместило бы все данные для определенного района и склада в том же самом узле хранения. В местном масштабе к каждому фрагменту полный первичный ключ будет все еще использоваться с алгоритмом хеширования в таком случае.

Для получения дополнительной информации о разделении, схемы выделения разделов и разделении ключей в MySQL см. Partitioning в MySQL Manual.

Единственный тип определенного пользователями разделения, которое поддерживается для использования с NDB, это ключевое разделение, включая линейное ключевое разделение.

Сигнатура.

bool getPartitionKey
(
  void
) const

Параметры. Нет.

Возвращаемое значение. true, если столбец часть ключа разделения для таблицы, иначе false.

2.3.2.4.12. Column::getPartSize()

Описание. Этот метод используется, чтобы получить размер части BLOB то есть, число байтов, которые сохранены в каждом кортеже таблицы blob.

Этот метод применим только к столбцам BLOB.

Сигнатура.

int getPartSize
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Размер части колонки как integer. В случае Tinyblob это значение 0 (то есть, только действующие байты сохранены).

2.3.2.4.13. Column::getPrecision()

Описание. Этот метод получает точность колонки.

Этот метод применим только к десятичным столбецам.

Сигнатура.

int getPrecision
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Точность колонки как integer. Точность определяется как количество значащих цифр, для получения дополнительной информации посмотрите обсуждение типа данных DECIMAL в Numeric Data Types.

2.3.2.4.14. Column::getPrimaryKey()

Описание. Этот метод используется, чтобы определить, является ли столбец частью первичного ключа таблицы.

Сигнатура.

bool getPrimaryKey
(
void
) const

Параметры. Нет.

Возвращаемое значение. true, если столбец часть первичного ключа таблицы, которой этот столбец принадлежит, иначе false.

2.3.2.4.15. Column::getScale()

Описание. Этот метод вернет масштаб для десятичного значения столбца.

Этот метод применим только к десятичным столбцам.

Сигнатура.

int getScale
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Масштаб десятичной колонки как integer. Масштаб десятичной колонки представляет количество цифр, которые могут быть сохранены после десятичной точки. Для этого значения возможно быть 0. См. описание типа данных DECIMAL в Numeric Data Types.

2.3.2.4.16. Column::getSize()

Описание. Эта функция используется, чтобы получить размер колонки.

Сигнатура.

int getSize
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Размер колонки в байтах (integer).

2.3.2.4.17. Column::getSizeInBytesForRecord()

Описание. Получает пространство, требуемое для данной колонки NdbRecord , в зависимости от типа колонки следующим образом:

  • Для BLOB это значение совпадает с sizeof(NdbRecord*), который составляет 4 или 8 байтов (размер указателя зависит от платформы).

  • Для столбцов всех других типов это совпадает со значением, возвращенным getSize().

Этот метод был добавлен в NDB 7.3.10 и NDB 7.4.7.

Сигнатура.

int getSizeInBytesForRecord
(
  void
) const

Параметры. Нет.

Возвращаемое значение. integer.

2.3.2.4.18. Column::getStorageType()

Описание. Этот метод получает тип хранения колонки.

Сигнатура.

StorageType getStorageType
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Значение StorageType , см. раздел 2.3.2.2.

2.3.2.4.19. Column::getStripeSize()

Описание. Этот метод получает размер полосы BLOB то есть, количество последовательных частей, чтобы сохранить в каждом узле кластера.

Сигнатура.

int getStripeSize
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Размер полосы колонки как integer.

2.3.2.4.20. Column::getType()

Описание. Этот метод получает тип данных колонки.

Сигнатура.

Type getType
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Type (тип данных) колонки. Для списка возможных значений посмотрите раздел 2.3.2.3.

2.3.2.4.21. Column::setArrayType()

Описание. Устанавливает тип массива для колонки.

Сигнатура.

void setArrayType
(
  ArrayType type
)

Параметры. Значение Column::ArrayType. См. раздел 2.3.2.1.

Возвращаемое значение. Нет.

2.3.2.4.22. Column::setCharset()

Описание. Этот метод может использоваться, чтобы установить набор символов и сопоставление столбца типа Char, Varchar или Text.

Этот метод применим только к столбцам Char, Varchar и Text.

Изменения, внесенные в колонки, используя этот метод, невидимы в MySQL.

Сигнатура.

void setCharset
(
  CHARSET_INFO* cs
)

Параметры. Этот метод берет один параметр. cs это указатель на структуру CHARSET_INFO. Для получения дополнительной информации посмотрите раздел 2.3.2.4.4.

Возвращаемое значение. Нет.

2.3.2.4.23. Column::setDefaultValue()

Описание. Этот метод устанавливает значение столбца в его умолчание, если он у него есть, иначе это устанавливает колонку в NULL.

Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по умолчанию, надо использовать Table::hasDefaultValues().

Сигнатура.

int setDefaultValue
(
  const void* buf,
  unsigned int len
)

Параметры. Этот метод берет 2 аргумента: указатель buf и длину данных len, как число значащих байтов. Для типов фиксированного размера это размер типа. Для типов переменной длины, ведущие 1 или 2 байта, которые указывают на buffer также содержат информацию о размере как нормальную для типа.

Возвращаемое значение. 0 на успехе, 1 на неудаче.

2.3.2.4.24. Column::setInlineSize

Описание. Этот метод получает действующий размер BLOB то есть, число начальных байтов, чтобы сохранить в признаке blob таблицы. Эта часть обычно сохраняется в оперативной памяти и может вноситься в указателе и интерпретироваться.

Этот метод применим только к BLOB.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setInlineSize
(
  int size
)

Параметры. integer size новый действующий размер для BLOB.

Возвращаемое значение. Нет.

2.3.2.4.25. Column::setLength()

Описание. Этот метод устанавливает длину колонки. Для множества переменной длины это максимальная длина, иначе это длина массива.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setLength
(
  int length
)

Параметры. Этот метод берет отдельный аргумент integer length, это новая длина для колонки.

Возвращаемое значение. Нет.

2.3.2.4.26. Column::setName()

Описание. Этот метод используется, чтобы определить имя колонки.

setName() единственный метод Column, результат которого видим MySQL Server. MySQL не видит никаких других изменений, внесенных в существующие столбцы, используя API NDB.

Сигнатура.

void setName
(
  const char* name
)

Параметры. Этот метод берет отдельный аргумент новое название колонки.

Возвращаемое значение. Нет.

2.3.2.4.27. Column::setNullable()

Описание. Этот метод переключает возможность столбца хранить null.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setNullable
(
  bool nullable
)

Параметры. true позволяет вставить NULL в колонку, если nullable = false, этот метод выполняет эквивалент изменения колонки к NOT NULL в MySQL.

Возвращаемое значение. Нет.

2.3.2.4.28. Column::setPartitionKey()

Описание. Этот метод позволяет добавить колонку к ключу разделения таблицы, к которой это принадлежит, или удалить колонку из ключа разделения таблицы.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Для получения дополнительной информации посмотрите раздел 2.3.2.4.11.

Сигнатура.

void setPartitionKey
(
  bool enable
)

Параметры. Единственный параметр enable типа Boolean. true to this method делает колонку частью ключа разделения таблицы, если enable = false, тогда столбец удален из ключа разделения.

Возвращаемое значение. Нет.

2.3.2.4.29. Column::setPartSize()

Описание. Этот метод устанавливает размер части BLOB то есть, число байтов, чтобы сохранить в каждом кортеже BLOB.

Этот метод применим только к BLOB.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setPartSize
(
  int size
)

Параметры. integer size это число байтов, чтобы сохранить в BLOB. Используя ноль для этого значения, только действующие байты могут быть сохранены, в действительности делая тип колонки TINYBLOB.

Возвращаемое значение. Нет.

2.3.2.4.30. Column::setPrecision()

Описание. Этот метод может использоваться, чтобы установить точность десятичной колонки.

Этот метод применим только к десятичным столбцам.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setPrecision
(
  int precision
)

Параметры. Этот метод берет единственный параметр: целое число, значение новой точности колонки. Для получения дополнительной информации о десятичной точности и масштабе, посмотрите разделы 2.3.2.4.13 и 2.3.2.4.15.

Возвращаемое значение. Нет.

2.3.2.4.31. Column::setPrimaryKey()

Описание. Этот метод используется, чтобы сделать колонку частью первичного ключа таблицы или удалить ее из первичного ключа.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setPrimaryKey
(
  bool primary
)

Параметры. Если true, столбец становится частью первичного ключа таблицы, если false, тогда столбец удален из первичного ключа.

Возвращаемое значение. Нет.

2.3.2.4.32. Column::setScale()

Описание. Этот метод может использоваться, чтобы установить масштаб десятичной колонки.

Этот метод применим только к десятичным столбцам.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setScale
(
  int scale
)

Параметры. Этот метод берет единственный параметр integer scale, новый масштаб для десятичной колонки. Для получения дополнительной информации о десятичной точности и масштабе, посмотрите разделы 2.3.2.4.13 и 2.3.2.4.15.

Возвращаемое значение. Нет.

2.3.2.4.33. Column::setStripeSize()

Описание. Этот метод устанавливает размер полосы BLOB то есть, количество последовательных частей, чтобы сохранить в каждом узле кластера.

Этот метод применим только к BLOB.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setStripeSize
(
  int size
)

Параметры. Этот метод берет отдельный аргумент. integer size новый размер полосы для колонки.

Возвращаемое значение. Нет.

2.3.2.4.34. Column::setStorageType()

Описание. Устанавливает тип хранения для колонки.

Сигнатура.

void setStorageType
(
  StorageType type
)

Параметры. Значение Column::StorageType. См. раздел 2.3.2.2.

Возвращаемое значение. Нет.

2.3.2.4.35. Column::setType()

Описание. Этот метод устанавливает Type (тип данных) колонки.

setType() сбрасывает все атрибуты столбца к их значениям по умолчанию, это должен быть первый метод, который вы называете, изменяя признаки данной колонки.

Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.

Сигнатура.

void setType
(
  Type type
)

Параметры. Этот метод берет единственный параметр Column::Type. По умолчанию The default is Unsigned. Для листинга всех разрешенных значений посмотрите раздел 2.3.2.3.

Возвращаемое значение. Нет.

2.3.3. Класс Datafile

Резюме

Эта секция покрывает класс 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 не определяет публичных типов.

2.3.3.1. Конструктор класса Datafile

Описание. Этот метод создает новый экземпляр Datafile или копию существующего.

Сигнатура. Создать новый экземпляр:

Datafile
(
  void
)

Создать копию существующего экземпляра Datafile:

Datafile
(
  const Datafile& datafile
)

Параметры. Новый экземпляр: Нет. Конструктор копии: ссылка на экземпляр Datafile, который будет скопирован.

Возвращаемое значение. Объект Datafile.

2.3.3.2. Datafile::getFileNo()

Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

Сигнатура.

Uint32 getFileNo
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Номер файла как unsigned 32-bit integer.

2.3.3.3. Datafile::getFree()

Описание. Этот метод получает свободное пространство, доступное в файле данных.

Сигнатура.

Uint64 getFree
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Число байтов, свободных в файле данных как unsigned 64-bit integer.

2.3.3.4. Datafile::getNode()

Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

Сигнатура.

Uint32 getNode
(
  void
) const

Параметры. Нет.

Возвращаемое значение. ID узла как unsigned 32-bit integer.

2.3.3.5. Datafile::getObjectId()

Описание. Этот метод используется, чтобы получить идентификатор объекта файла данных.

Сигнатура.

virtual int getObjectId
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Идентификатор объекта файла данных как integer.

2.3.3.6. Datafile::getObjectStatus()

Описание. Этот метод используется, чтобы получить статус объекта файла данных.

Сигнатура.

virtual Object::Status getObjectStatus
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Файл данных Status. См. раздел 2.3.31.4.

2.3.3.7. Datafile::getObjectVersion()

Описание. Этот метод получает версию объекта файла данных (см. NDB Schema Object Versions).

Сигнатура.

virtual int getObjectVersion
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Версия объекта файла данных как integer.

2.3.3.8. Datafile::getPath()

Описание. Этот метод возвращает путь файловой системы к файлу данных.

Сигнатура.

const char* getPath
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Путь к файлу данных в файловой системе узла данных, строка (указатель на символ).

2.3.3.9. Datafile::getSize()

Описание. Этот метод получает размер файла данных в байтах.

Сигнатура.

Uint64 getSize
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Размер файла данных в байтах как unsigned 64-bit integer.

2.3.3.10. Datafile::getTablespace()

Описание. Этот метод может использоваться, чтобы получить название табличного пространства, которому принадлежит файл данных.

Можно также получить доступ к ID связанного табличного пространства непосредственно. Посмотрите раздел 2.3.3.11.

Сигнатура.

const char* getTablespace
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Название связанного табличного пространства.

2.3.3.11. Datafile::getTablespaceId()

Описание. Этот метод получает ID табличного пространства, которому принадлежит файл данных.

Можно также получить доступ к названию связанного табличного пространства непосредственно. Посмотрите раздел 2.3.3.10.

Сигнатура.

Uint32 getTablespaceId
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Этот метод возвращает ID табличного пространства как unsigned 32-bit integer.

2.3.3.12. Datafile::setNode()

Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

Сигнатура.

void setNode
(
  Uint32 nodeId
)

Параметры. nodeId узла, на котором файл данных должен быть расположен (unsigned 32-bit integer).

Возвращаемое значение. Нет.

2.3.3.13. Datafile::setPath()

Описание. Этот метод устанавливает путь к файлу данных в файловой системе узла данных.

Сигнатура.

const char* setPath
(
  void
) const

Параметры. Путь к файлу, строка.

Возвращаемое значение. Нет.

2.3.3.14. Datafile::setSize()

Описание. Этот метод устанавливает размер файла данных.

Сигнатура.

void setSize
(
  Uint64 size
)

Параметры. Этот метод берет единственный параметр: желаемый размер size в байтах для файла данных как unsigned 64-bit integer.

Возвращаемое значение. Нет.

2.3.3.15. Datafile::setTablespace()

Описание. Этот метод используется, чтобы связать файл данных с табличным пространством.

Сигнатуры. setTablespace() может быть вызван любым из двух способов, перечисленных здесь:

  • Используя название табличного пространства, как показано здесь:

    void setTablespace
    (
      const char* name
    )
    
  • Используя ссылку на объект Tablespace .

    void setTablespace
    (
      const class Tablespace& tablespace
    )
    

Параметры. Этот метод берет единственный параметр, который может быть одним из следующего:

  • Имя name табличного пространства (указатель на символ).

  • Ссылка tablespace для передачи объекта Tablespace.

Возвращаемое значение. Нет.

2.3.4. Класс Dictionary

Резюме

Эта секция описывает класс 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.

2.3.4.1. Конструктор класса Dictionary

Описание. Этот метод создает новый экземпляр класса Dictionary.

Конструктор и деструктор для этого класса защищенные методы, а не публичные.

Сигнатура.

protected Dictionary
(
  Ndb& ndb
)

Параметры. Объект Ndb.

Возвращаемое значение. Объект Dictionary.

Деструктор. Деструктор не берет параметров и ничего не возвращает.

protected ~Dictionary
(
  void
)

2.3.4.2. Dictionary::beginSchemaTrans()

Описание. Начинает транзакцию схемы. Ошибка происходит, если транзакция уже активна или если ядерные метаданные блокированы. Можно определить, существует ли уже транзакция схемы, используя метод hasSchemaTrans().

Операция по метаданным происходит каждый раз, когда объекты данных созданы, изменены или удалены, такая операция может создать дополнительные подоперации в ядре NDB.

Объект Ndb и его связанный Dictionary поддерживают одну транзакцию схемы за один раз. По умолчанию каждая операция по метаданным выполняется отдельно, то есть, для каждой операции транзакция схемы начата неявно, операция (включая любые подоперации) выполняется и транзакция закончена.

Также возможно начать и закончить транзакцию схемы явно и выполнить ряд определенных пользователями операций атомарно в ее границах. В этом случае все операции в транзакции схемы имеют успех или прерваны и отменены как единица. Это сделано, выполнив шаги, перечисленные здесь:

  1. Чтобы начать транзакцию схемы, вызовите beginSchemaTrans().

  2. Выполните желаемые операции (например, createTable()).

  3. Закончите транзакцию схемы, вызывая endSchemaTrans.

Каждую операцию посылают в ядро NDB, которое разбирает и сохраняет ее. Неудача разбора приводит к откату к предыдущей пользовательской операции перед возвратом, в этом пункте пользователь может продолжить или прервать всю транзакцию.

После того, как все операции были представлены, endSchemaTrans() обрабатывает и передает их. В случае ошибки немедленно прерывается транзакция.

Если пользователь выходит перед запросом endSchemaTrans(), ядро NDB прерывает транзакцию. Если пользователь выходит перед возвратом из endSchemaTrans(), ядро продолжает запрос, и о его статусе завершения сообщает в регистрации кластера.

Сигнатура.

int beginSchemaTrans
(
  void
)

Параметры. Нет.

Возвращаемое значение. 0 на успехе, -1 на ошибке.

2.3.4.3. Dictionary::createDatafile()

Описание. Этот метод создает новый файл данных, заданный объектом Datafile.

Сигнатура.

int createDatafile
(
  const Datafile& dFile
)

Параметры. Отдельный аргумент: ссылка на экземпляр Datafile.

Возвращаемое значение. 0 на успехе, -1 на ошибке.

2.3.4.4. Dictionary::createEvent()

Описание. Создает событие, учитывая ссылку на объект Event.

Необходимо иметь в виду, что API NDB не отслеживает ассигнованные объекты-события, что означает, что пользователь должен удалить Event, если это было получено, используя createEvent(), после того, как этот объект больше не требуется.

Сигнатура.

int createEvent
(
  const Event& event
)

Параметры. Ссылка event на объект Event .

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.5. Dictionary::createForeignKey()

Описание. Создает объект ForeignKey, учитывая ссылку на этот объект и ID Object .

Сигнатура.

int createForeignKey
(
  const ForeignKey&,
  ObjectId* = 0,
  int flags = 0
)

Параметры. Ссылка на объект ForeignKey и Object ID. Дополнительная значение flags , если используется, позволяет создание внешнего ключа, не выполняя проверок внешнего ключа. Если установлено, его значение должно быть CreateFK_NoVerify (1).

Возвращаемое значение. 0 при успехе.

2.3.4.6. Dictionary::createHashMap()

Описание. Создает HashMap.

Сигнатура.

int createHashMap
(
  const HashMap& hashmap,
  ObjectId* id = 0
)

Параметры. Ссылка на хэш-карту и опционально ID, который будет назначен на нее. Добавлено в NDB 7.2.7.

Возвращаемое значение. 0 на успехе, на неудаче вернет -1 и устанавливает ошибку.

2.3.4.7. Dictionary::createIndex()

Описание. Этот метод создает индекс, заданный экземпляром Index и возможно дополнительным экземпляром Table.

Сигнатура. Этот метод может быть вызван с или без ссылки на объект таблицы:

int createIndex
(
  const Index& index
)
int createIndex
(
  const Index& index,
  const Table& table
)

Параметры. Надо: ссылка на объект Index. Опционально: ссылка на объект Table.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.8. Dictionary::createLogfileGroup()

Описание. Этот метод создает новую группу файла журнала, заданную экземпляром LogfileGroup.

Сигнатура.

int createLogfileGroup
(
  const LogfileGroup& lGroup
)

Параметры. Отдельный аргумент, ссылка на объект LogfileGroup.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.9. Dictionary::createRecord()

Описание. Этот метод используется, чтобы создать объект NdbRecord для использования в таблице или операций по просмотру индекса.

Сигнатура. Вызов этого метода зависит от того, должна ли получающаяся NdbRecord использоваться в операциях по индексу или таблице:

Чтобы создать NdbRecord для использования в операциях по таблице используйте следующее:

NdbRecord* createRecord
(
  const Table* table,
  const RecordSpecification* recSpec,
  Uint32 length,
  Uint32 elSize
)

Чтобы создать NdbRecord для использования в операциях по индексу можно использовать любое из следующего:

NdbRecord* createRecord
(
  const Index* index,
  const Table* table,
  const RecordSpecification* recSpec,
  Uint32 length,
  Uint32 elSize
)

или

NdbRecord* createRecord
(
  const Index* index,
  const RecordSpecification* recSpec,
  Uint32 length,
  Uint32 elSize
)

Параметры. Dictionary::createRecord() берет следующие параметры:

  • Если NdbRecord должна использоваться с индексом, указатель на объект Index. Если NdbRecord должна использоваться с таблицей, этот параметр опущен. См. раздел 2.3.11.

  • Указатель на объект Table, представляющий таблицу, которая будет просмотрена. Если Ndbrecord будет использоваться с индексом, тогда это произвольно определяет таблицу, содержащую этот индекс. См. раздел 2.3.37.

  • RecordSpecification используется, чтобы описать колонку. См. раздел 2.3.34.

  • Длина length записи.

  • elSize задает размер элементов, составляющих запись.

Возвращаемое значение. NdbRecord для использования в операциях, включающих данную таблицу или индекс.

Пример. См. раздел 2.3.27.

2.3.4.10. Dictionary::createTable()

Описание. Составляет таблицу, используя данный экземпляр Table.

Таблицы, созданные с использованием этого метода, не могут быть видны MySQL Server, не могут быть обновлены клиентами MySQL и не могут копироваться.

Сигнатура.

int createTable
(
  const Table& table
)

Параметры. Экземпляр Table. См. раздел 2.3.37.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.11. Dictionary::createTablespace()

Описание. Этот метод создает новое табличное пространство, заданное объектом Tablespace .

Сигнатура.

int createTablespace
(
  const Tablespace& tSpace
)

Параметры. Этот метод требует отдельного аргумента: ссылки на экземпляр Tablespace.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.12. Dictionary::createundofile()

Описание. Этот метод создает новый файл отмен, заданный объектом undofile.

Сигнатура.

int createundofile
(
  const undofile& uFile
)

Параметры. Этот метод требует одного аргумента: ссылки на экземпляр undofile.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.13. Dictionary::dropDatafile()

Описание. Этот метод удаляет файл данных, заданный объектом Datafile.

Сигнатура.

int dropDatafile
(
  const Datafile& dFile
)

Параметры. Отдельный аргумент: ссылка на экземпляр Datafile.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.14. Dictionary::dropEvent()

Описание. Этот метод удаляет событие учитывая ссылку на объект Event.

Сигнатура.

int dropEvent
(
  const char* name,
  int force = 0
)

Параметры. Этот метод берет два параметра:

  • name имя события, которое будет удалено, как строка.

  • По умолчанию dropEvent() терпит неудачу, если определенное событие не существует. Можно отвергнуть это поведение, передав любое ненулевое значение для дополнительного параметра force, в этом случае никакая проверка не осуществлена относительно того, есть ли на самом деле такое событие, и ошибка возвращена, только если событие существует, но по любой причине невозможно его удалить.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.15. Dictionary::dropForeignKey()

Описание. Этот метод удаляет внешний ключ учитывая ссылку на объект ForeignKey.

Сигнатура.

int dropForeignKey
(
  const ForeignKey&
)

Параметры. Ссылка на удаляемый объект ForeignKey.

Возвращаемое значение. 0 при успехе.

2.3.4.16. Dictionary::dropIndex()

Описание. Этот метод удаляет индекс, переданный экземпляром Index, и возможно дополнительным экземпляром Table.

Сигнатура.

int dropIndex
(
  const Index& index
)
int dropIndex
(
  const Index& index,
  const Table& table
)

Параметры. Этот метод берет два параметра, один из которых дополнительный:

  • Надо. Ссылка на объект Index.

  • Опционально. Ссылка на объект Table.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.17. Dictionary::dropLogfileGroup()

Описание. Берет экземпляр LogfileGroup и удаляет соответствующую группу файла журнала.

Сигнатура.

int dropLogfileGroup
(
  const LogfileGroup& lGroup
)

Параметры. Отдельный аргумент, ссылка на объект LogfileGroup.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.18. Dictionary::dropTable()

Описание. Удаляет таблицу, заданную экземпляром 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 при неудаче.

2.3.4.19. Dictionary::dropTablespace()

Описание. Этот метод удаляет табличное пространство, заданное объектом Tablespace.

Сигнатура.

int dropTablespace
(
  const Tablespace& tSpace
)

Параметры. Этот метод требует отдельного аргумента: ссылки на экземпляр Tablespace.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.20. Dictionary::dropundofile()

Описание. Этот метод удаляет файл отката, заданный объектом undofile .

Сигнатура.

int dropundofile
(
  const undofile& uFile
)

Параметры. Этот метод требует один аргумент: ссылку на экземпляр undofile.

Возвращаемое значение. 0 при успехе, -1 при неудаче.

2.3.4.21. Dictionary::endSchemaTrans()

Описание. Заканчивает транзакцию схемы, начатую beginSchemaTrans(), операции будут обработаны и переданы или прерваны и отменены. Этот метод объединяет операционное выполнение и закрытие, отдельные методы для этих задач не требуются. Этот метод можно вызвать успешно, даже если никакая транзакция схемы в настоящее время неактивна.

Как со многими другими методами API NDB, возможно для endSchemaTrans() переписывать любой текущий код ошибки. Поэтому необходимо сначала проверить и сохранить любой код ошибки, который, возможно, следовал из предыдущей, неудавшейся операции.

Сигнатура.

int endSchemaTrans
(
  Uint32 flags = 0
)

Параметры. Флаги определяют, как законченная транзакция обработана. По умолчанию 0 заставляет транзакцию быть переданной.

Dictionary::SchemaTransFlag. Можно также использовать с endSchemaTrans() любое из этих значений SchemaTransFlag:

  • SchemaTransAbort (= 1): Заставляет транзакцию быть прерванной.

  • SchemaTransBackground (= 2): Заставляет транзакцию выполняться в фоновом режиме, результат написан регистрации кластера в то время, как приложение продолжается, не ожидая ответа.

Возвращаемое значение. 0 при удаче, в случае ошибки -1 и установит код ошибки NdbError.

2.3.4.22. Dictionary::getDatafile()

Описание. Этот метод используется, чтобы получить объект Datafile, учитывая ID узла данных, где файл данных расположен и путь к файлу данных в файловой системе того узла.

Сигнатура.

Datafile getDatafile
(
  Uint32 nodeId,
  const char* path
)

Параметры. Этот метод должен быть вызван, используя два аргумента, как показано здесь:

  • 32-bit unsigned integer nodeId узла данных, где файл данных расположен.

  • path задает путь к файлу данных в файловой системе узла (строка как указатель на символ).

Возвращаемое значение. Объект Datafile, см. раздел 2.3.3.

2.3.4.23. Dictionary::getDefaultHashMap()

Описание. Получите хэш-карту таблицы по умолчанию.

Добавлен в NDB 7.2.7.

Сигнатура.

int getDefaultHashMap
(
  HashMap& dst,
  Uint32 fragments
)

или

int getDefaultHashMap
(
  HashMap& dst,
  Uint32 buckets,
  Uint32 fragments
)

Возвращаемое значение. 0 при успехе, при неудаче -1 и установит ошибку.

2.3.4.24. Dictionary::getEvent()

Описание. Этот метод используется, чтобы получить новый объект Event, представляющий событие, учитывая имя события.

getEvent() ассигнует память каждый раз, когда это успешно вызывают. Необходимо иметь в виду, что последовательные вызовы этого метода, используя то же самое событие, вызывают возвращение многократных отдельных объектов.

NDB API не отслеживает ассигнованные объекты-события, что означает, что пользователь должен удалить каждый Event, созданный с использованием getEvent(), после того, как объект больше не требуется.

Сигнатура.

const Event* getEvent
(
  const char* eventName
)

Параметры. Строка eventName как указатель на символ.

Возвращаемое значение. Указатель на объект Event. См. раздел 2.3.6.

2.3.4.25. Dictionary::getForeignKey()

Описание. Этот метод используется, чтобы получить новый объект ForeignKey , представляющий событие, учитывая ссылку на внешний ключ и его имя.

Сигнатура.

int getForeignKey
(
  ForeignKey& dst,
  const char* name
)

Параметры. Ссылка на внешний ключ и name как указатель на символ.

Возвращаемое значение. Указатель на объект ForeignKey.

2.3.4.26. Dictionary::getHashMap()

Описание. Получает хэш-карту по имени или таблице.

Добавлено в NDB 7.2.7.

Сигнатура.

int getHashMap
(
  HashMap& dst,
  const char* name
)

или

int getHashMap
(
  HashMap& dst,
  const Table* table
)

Параметры. Ссылка на хэш-карту и имя или на Table.

Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.

2.3.4.27. Dictionary::getIndex()

Описание. Этот метод получает указатель на индекс, учитывая название индекса и название таблицы, которой принадлежит индекс.

Сигнатура.

const Index* getIndex
(
  const char* iName,
  const char* tName
) const

Параметры. Требуются два параметра:

  • Название индекса (iName).

  • Название таблицы, которой принадлежит индекс (tName).

Оба это строковые значения, представленные указателями на символ.

Возвращаемое значение. Указатель на Index. См. раздел 2.3.11.

2.3.4.28. Dictionary::getLogfileGroup()

Описание. Этот метод получает объект LogfileGroup, учитывая имя группы файла журнала.

Сигнатура.

LogfileGroup getLogfileGroup
(
  const char* name
)

Параметры. Имя name группы файла журнала.

Возвращаемое значение. Экземпляр LogfileGroup, см. раздел 2.3.13.

2.3.4.29. Dictionary::getNdbError()

Описание. Этот метод получает ошибку NDB API.

Сигнатура.

const struct NdbError& getNdbError
(
  void
) const

Параметры. Нет.

Возвращаемое значение. Ссылка на объект NdbError, см. раздел 2.3.20.

2.3.4.30. Dictionary::getTable()

Описание. Этот метод может использоваться, чтобы получить доступ к таблице с известным именем. Посмотрите раздел 2.3.37.

Сигнатура.

const Table* getTable
(
  const char* name
) const

Параметры. Имя name.

Возвращаемое значение. Указатель на таблицу или NULL, если нет никакой таблицы с именем name.

2.3.4.31. Dictionary::getTablespace()

Описание. Учитывая имя или 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.

    2.3.4.32. Dictionary::getundofile()

    Описание. Этот метод получает объект undofile, учитывая ID узла, где файл отмены расположен и путь файловой системы к файлу.

    Сигнатура.

    undofile getundofile
    (
      Uint32nodeId,
      const char* path
    )
    

    Параметры. Этот метод требует следующих двух аргументов:

    • nodeId узла данных, где расположен файл отмены, это значение передается как 32-bit unsigned integer.

    • path путь к файлу отмены в файловой системе узла (строка как указатель на символ).

    Возвращаемое значение. Экземпляр undofile . См. раздел 2.3.39.

    2.3.4.33. Dictionary::hasSchemaTrans()

    Описание. Говорит, продолжается ли транзакция схемы API NDB.

    Сигнатура.

    bool hasSchemaTrans
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. TRUE, если транзакция схемы происходит, иначе FALSE.

    2.3.4.34. Dictionary::initDefaultHashMap()

    Описание. Инициализирует хэш-карту по умолчанию для таблицы.

    Добавлено в NDB 7.2.7.

    Сигнатура.

    int initDefaultHashMap
    (
      HashMap& dst, Uint32 fragments
    )
    

    или

    int initDefaultHashMap
    (
      HashMap& dst,
      Uint32 buckets,
      Uint32 fragments
    )
    

    Параметры. Ссылка на хэш-карту и количество фрагментов. Произвольно количество букетов.

    Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.

    2.3.4.35. Dictionary::invalidateIndex()

    Описание. Этот метод используется, чтобы лишить законной силы кэшированный индексный объект.

    Сигнатура. На индекс, лишенный законной силы этим методом, можно сослаться как на объект Index (используя указатель) или по имени индекса и таблицы, как показано здесь:

    void invalidateIndex
    (
      const char* indexName,
      const char* tableName
    )
    
    void invalidateIndex
    (
      const Index* index
    )
    

    Параметры. Названия индекса, который будет удален из кэша и таблицы, которой это принадлежит (indexName и tableName, соответственно) или указатель на объект Index.

    Возвращаемое значение. Нет.

    2.3.4.36. DIctionary::invalidateTable()

    Описание. Этот метод используется, чтобы лишить законной силы кэшированный объект таблицы.

    Сигнатура.

    void invalidateTable
    (
      const char* name
    )
    

    Допустимо использовать объект Table, а не название таблицы, как показано здесь:

    void invalidateTable
    (
      const Table* table
    )
    

    Параметры. Имя name таблицы, которая будет удалена из кэша таблиц или указатель на объект Table.

    Возвращаемое значение. Нет.

    2.3.4.37. Dictionary::listEvents()

    Описание. Этот метод возвращает список всех событий, определенных в рамках словаря.

    Сигнатура.

    int listEvents
    (
      List& list
    )
    

    Параметры. Ссылка на объект List. См. раздел 2.3.14.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.4.38. Dictionary::listIndexes()

    Описание. Этот метод используется, чтобы получить List всех индексов в таблице, учитывая название таблицы. См. раздел 2.3.14.

    Сигнатура.

    int listIndexes
    (
      List&list,
      const char* table
    ) const
    

    Параметры. listIndexes() берет два аргумента, оба из которых требуются:

    • Ссылка на List , это содержит индексы после вызова метода.

    • Название таблицы table, чьи индексы должны быть перечислены.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.4.39. Dictionary::listObjects()

    Описание. Этот метод используется, чтобы получить список объектов в словаре. Возможно получить все объекты в словаре или ограничить список объектами единственного типа.

    Сигнатуры.

    int listObjects
    (
      List&list,
      Object::Type type = Object::TypeUndefined
    ) const
    

    или

    int listObjects
    (
      List&list,
      Object::Type type,
      bool fullyQualified
    ) const
    

    Параметры. Ссылка на объект List требуется: это список, который содержит объекты словаря после вызова listObjects(). См. раздел 2.3.14. Дополнительный второй аргумент type может использоваться, чтобы ограничить список только объектами заданного типа то есть, указанного Object::Type. См. раздел 2.3.31.6. Если type не задан, тогда список содержит все объекты словаря.

    Можно также определить, действительно ли имена объектов в list полностью квалифицированы (то есть, включает ли имя объекта базу данных, схему и возможно имя таблицы). Если вы определяете fullyQualified, тогда необходимо также определить type.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.4.40. Dictionary::prepareHashMap()

    Описание. Создает или получает хэш-карту, подходящую для изменения. Требует, чтобы транзакция схемы произошла, посмотрите раздел 2.3.4.2.

    Добавлено в NDB 7.2.7.

    Сигнатура.

    int prepareHashMap
    (
      const Table& oldTable,
      Table& newTable
    )
    

    или

    int prepareHashMap
    (
      const Table& oldTable,
      Table& newTable,
      Uint32 buckets
    )
    

    Параметры. Ссылки на старые и новые таблицы. Произвольно число букетов.

    Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.

    2.3.4.41. Dictionary::releaseRecord()

    Описание. Этот метод освобождает NdbRecord , когда это больше не необходимо.

    Сигнатура.

    void releaseRecord
    (
      NdbRecord* record
    )
    

    Параметры. NdbRecord для очистки.

    Возвращаемое значение. Нет.

    Пример. См. раздел 2.3.27.

    2.3.4.42. Dictionary::removeCachedTable()

    Описание. Этот метод удаляет указанную таблица из местного кэша.

    Сигнатура.

    void removeCachedTable
    (
      const char* table
    )
    

    Параметры. Название table для удаления из кэша.

    Возвращаемое значение. Нет.

    2.3.4.43. Dictionary::removeCachedIndex()

    Описание. Этот метод удаляет указанный индекс из местного кэша.

    Сигнатура.

    void removeCachedIndex
    (
      const char* index,
      const char* table
    )
    

    Параметры. Метод removeCachedIndex() требует двух аргументов:

    • Имя индекса index для удаления.

    • Имя таблицы table, в которой найден индекс.

    Возвращаемое значение. Нет.

    2.3.5. Структура Element

    Резюме

    Эта секция обсуждает структуру 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 Имя объекта

    2.3.6. Класс Event

    Резюме

    Эта секция обсуждает класс 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.

    Имя Описание
    NdbEventOperation::getEventType() NdbEventOperation::getEventType2()
    NdbEventOperation::getGCI() NdbEventOperation::getEpoch
    NdbEventOperation::getLatestGCI() Ndb::getHighestQueuedEpoch()
    NdbEventOperation::isOverrun() Нет, используйте NdbEventOperation::getEventType2()
    NdbEventOperation::hasError() Нет, используйте NdbEventOperation::getEventType2()
    NdbEventOperation::clearError() Нет
    Нет NdbEventOperation::isEmptyEpoch()
    Нет NdbEventOperation::isErrorEpoch()
    Ndb::pollEvents() Ndb::pollEvents2()
    Ndb::nextEvent() Ndb::nextEvent2()
    Ndb::getLatestGCI() Ndb::getHighestQueuedEpoch()
    Ndb::getGCIEventOperations() Ndb::getNextEventOpInEpoch2()
    Ndb::isConsistent()Нет
    Ndb::isConsistentGCI() Нет

    Обработка ошибок используя новый 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() Определяет возможность сообщения для события таблицы

    2.3.6.1. Event::addEventColumn()

    Описание. Этот метод используется, чтобы добавить колонку, на которой должны быть обнаружены события. Столбец может быть обозначен 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 (как постоянный указатель на символ).

    Возвращаемое значение. Нет.

    2.3.6.2. Event::addEventColumns()

    Описание. Этот метод используется, чтобы позволить обнаружение событий на нескольких столбцах в то же время. Необходимо использовать названия столбцов.

    Как и addEventColumn(), надо вызвать Dictionary::createEvent() прежде, чем любые ошибки будут обнаружены. Посмотрите раздел 2.3.4.4.

    Сигнатура.

    void addEventColumns
    (
      int n,
      const char** columnNames
    )
    

    Параметры. Этот метод требует двух аргументов, перечисленных здесь:

    • Количество столбцов n (integer).

    • Названия столбцов columnNames это должно быть передано как указатель на указатель на символ.

    Возвращаемое значение. Нет.

    2.3.6.3. Event::addTableEvent()

    Описание. Этот метод используется, чтобы добавить типы событий, которые должны быть обнаружены.

    Сигнатура.

    void addTableEvent
    (
      const TableEvent te
    )
    

    Параметры. Этот метод требует значение TableEvent.

    Возвращаемое значение. Нет.

    2.3.6.4. Конструктор Event

    Описание. Конструктор Event создает новый экземпляр с именем, произвольно связанный с таблицей.

    Необходимо иметь в виду, что API NDB не отслеживает ассигнованные объекты-события, что означает, что пользователь должен явно удалить the Event после того, как это больше не используется.

    Сигнатуры.

    Event
    (
      const char* name
    )
    

    Альтернативно, можно использовать имя событий и связанную таблицу:

    Event
    (
      const char* name,
      const NdbDictionary::Table& table
    )
    

    Параметры. Как минимум, имя name (как постоянный указатель на символ), поскольку событие требуется. Произвольно, событие может также быть связано с таблицей, этим аргументом, когда существует, является ссылка на объхект Table (см. раздел 2.3.37).

    Возвращаемое значение. Новый экземпляр Event.

    Деструктор. Деструктор для этого класса поставляется как виртуальный метод, который не берет аргументов и чей тип возвращения void.

    2.3.6.5. Event::EventDurability

    Резюме

    Эта секция обсуждает EventDurability, тип, определенный классом Event.

    Описание. Значения этого типа используются, чтобы описать жизнь или постоянство события, а также его объем.

    Возможные значения.

    Таблица 2.17.

    Имя Описание
    ED_UNDEFINED Событие не определено или неподдержанного типа.
    ED_SESSION Это событие сохраняется только на время текущей сессии и доступно только текущему приложению. Это удалено после того, как приложение разъединяется или после перезапуска кластера. Значение ED_SESSION резервируется для будущего использования и еще не поддерживается ни в каком выпуске кластера NDB.
    ED_TEMPORARY Любое приложение может использовать событие, но это удалено после перезапуска кластера. Значение ED_TEMPORARY резервируется для будущего использования и еще не поддерживается ни в каком выпуске кластера NDB.
    ED_PERMANENT Любое приложение может использовать событие и это сохраняется, пока не удалено приложением, даже после перезапуска кластера. Значение ED_PERMANENT резервируется для будущего использования и еще не поддерживается ни в каком выпуске кластера NDB.

    2.3.6.6. Event::EventReport

    Резюме

    Эта секция обсуждает тип EventReport, определенный классом Event.

    Описание. Значения этого типа используются, чтобы определить возможности сообщения для событий таблицы.

    Возможные значения.

    Таблица 2.18.

    Имя Описание
    ER_UPDATED Сообщение о событиях обновления.
    ER_ALL Сообщение обо всех событиях, за исключением тех, которые не приводят к любым обновлениям действующих частей столбцов BLOB.
    ER_SUBSCRIBE Сообщение о подписных событиях.
    ER_DDL Сообщение о событиях DDL (см. раздел 2.3.6.20).

    2.3.6.7. Event::getDurability()

    Описание. Этот метод получает жизнь и объем события (то есть, EventDurability).

    Сигнатура.

    EventDurability getDurability
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение EventDurability.

    2.3.6.8. Event::getEventColumn()

    Описание. Этот метод используется, чтобы получить определенную колонку из числа тех, на которых определяется событие.

    Сигнатура.

    const Column* getEventColumn
    (
      unsigned no
    ) const
    

    Параметры. Номер (no) колонки, как получено использованием getNoOfColumns() (см. раздел 2.3.6.10).

    Возвращаемое значение. Указатель на Column, соответствующий no.

    2.3.6.9. Event::getName()

    Описание. Этот метод получает название события.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название события, как указатель на символ.

    2.3.6.10. Event::getNoOfEventColumns()

    Описание. Этот метод получает количество столбцов, на которых определяется событие.

    Сигнатура.

    int getNoOfEventColumns
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество столбцов (integer) или -1 в случае ошибки.

    2.3.6.11. Event::getObjectStatus()

    Описание. Этот метод получает статус объекта события.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Статус объекта события. Для возможных значений посмотрите раздел 2.3.31.4.

    2.3.6.12. Event::getObjectVersion()

    Описание. Этот метод получает версию объекта события (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта события как integer.

    2.3.6.13. Event::getObjectId()

    Описание. Этот метод получает идентификатор объекта события.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта события как integer.

    2.3.6.14. Event::getReport()

    Описание. Этот метод используется, чтобы получить опции сообщения для этого события.

    Сигнатура.

    EventReport getReport
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Опции сообщения определяются в разделе 2.3.6.6.

    2.3.6.15. Event::getTable()

    Описание. Этот метод используется, чтобы найти таблицу, с которой связано событие. Это возвращает ссылку на объект Table. Можно также получить название таблицы непосредственно, используя getTableName().

    Сигнатура.

    const NdbDictionary::Table* getTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Таблица, с которой событие связано, если есть, как указатель на объект Table, иначе NULL. См. раздел 2.3.37.

    2.3.6.16. Event::getTableEvent()

    Описание. Этот метод используется, чтобы проверить, будет ли данное событие таблицы обнаружено.

    Сигнатура.

    bool getTableEvent
    (
      const TableEvent te
    ) const
    

    Параметры. Этот метод берет единственный параметр, тип события таблицы, то есть значение TableEvent.

    Возвращаемое значение. Этот метод вернет true, если событие TableEvent типа te будет обнаружено. Иначе возвращаемое значение false.

    2.3.6.17. Event::getTableName()

    Описание. Этот метод получает название таблицы, с которой событие связано, может служить удобной альтернативой getTable(). См. раздел 2.3.6.15.

    Сигнатура.

    const char* getTableName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название таблицы, связанной с этим событием, как указатель на символ.

    2.3.6.18. Event::mergeEvents()

    Описание. Этот метод используется, чтобы установить флаг слияния событий, который является по умолчанию false. Установка его к true подразумевает, что события слиты следующим образом:

    • Для данного NdbEventOperation, связанного с этим событием, события на том же самом первичном ключе в том же самом глобальном индексе контрольной точки (GCI) слиты в единственное событие.

    • Событие таблицы blob создается для каждого признака blob и события blob обработаны как часть главных событий таблицы.

    • Данные о Blob из событий части blob могут быть прочитаны через методы NdbBlob как единственное значение.

    В настоящее время этот флаг не унаследован NdbEventOperation и должен быть установлен на NdbEventOperation явно, см. раздел 2.3.21.

    Сигнатура.

    void mergeEvents
    (
      bool flag
    )
    

    Параметры. Значение flag.

    Возвращаемое значение. Нет.

    2.3.6.19 Event::setDurability()

    Описание. Этот метод устанавливает длительность события то есть, время жизни и объем.

    Сигнатура.

    void setDurability(EventDurability ed)
    

    Параметры. Этот метод требует значение EventDurability.

    Возвращаемое значение. Нет.

    2.3.6.20. Event::setReport()

    Описание. Этот метод используется, чтобы установить возможность сообщения для события. Значения возможных опций могут быть найдены в разделе 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.21. Event::setName()

    Описание. Этот метод используется, чтобы определить имя события. Имя должно быть уникальным среди всех событий, видимых от текущего приложения (см. раздел 2.3.6.7).

    Можно также определить имя события, сначала создав его. Посмотрите раздел 2.3.6.4.

    Сигнатура.

    void setName
    (
      const char* name
    )
    

    Параметры. Имя name для события (как постоянный указатель на символ).

    Возвращаемое значение. Нет.

    2.3.6.22. Event::setTable()

    Описание. Этот метод определяет таблицу, на которой должны быть обнаружены события.

    По умолчанию обнаружение событий происходит на всех столбецх в таблице. Используйте 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 для таблицы.

    2.3.6.23. Event::TableEvent

    Резюме

    Эта секция описывает тип 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.

    2.3.7. Структура EventBufferMemoryUsage

    Резюме

    Эта секция описывает структуру 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)

    2.3.8. Класс ForeignKey

    Резюме

    Этот класс представляет внешний ключ на таблице 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.

    2.3.8.1. ForeignKey()

    Описание. Создайте совершенно новую ссылку внешнего ключа или копию существующего.

    Сигнатура. Новый экземпляр:

    ForeignKey
    (
      void
    )
    

    Конструктор копии:

    ForeignKey
    (
      const ForeignKey&
    )
    

    Параметры. Для нового экземпляра: Нет.

    Для конструктора копии: ссылка на существующий экземпляр ForeignKey.

    Возвращаемое значение. Новый экземпляр ForeignKey.

    2.3.8.2. ForeignKey::FkAction

    FkAction это перечисление, которое представляет действие для внешнего ключа, когда обновление или удаление выполняется на родительской таблице.

    Возможные значения.

    Таблица 2.22.

    Имя Описание
    NoAction NO ACTION: Отсроченная проверка.
    Restrict RESTRICT: Отклоните операцию на родительской таблице.
    Cascade CASCADE: Выполните операцию на строке из родительской таблицы, выполните ту же самую операцию при соответствии строкам в дочерней таблице.
    SetNull SET NULL: Выполните операцию на строке из родительской таблицы, установите любые колонки внешнего ключа соответствия в дочерней таблице к NULL.
    SetDefault SET DEFAULT: В настоящее время не поддержано в NDB Cluster.

    См. FOREIGN KEY Constraints в MySQL Manual.

    2.3.8.3. ForeignKey::getName()

    Описание. Получает название экземпляра ForeignKey, для которого вызван метод.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя ForeignKey.

    2.3.8.4. ForeignKey::getParentTable()

    Описание. Получает родительскую таблицу для экземпляра ForeignKey, для которого вызван метод.

    Сигнатура.

    const char* getParentTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на родительскую таблицу ForeignKey.

    2.3.8.5. ForeignKey::getChildTable()

    Описание. Получает дочернюю таблицу для экземпляра ForeignKey, для которого вызван метод.

    Сигнатура.

    const char* getChildTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на дочернюю таблицу ForeignKey.

    2.3.8.6. ForeignKey::getParentColumnCount()

    Описание. Получает количество столбцов в родительской таблице этого ForeignKey.

    Сигнатура.

    unsigned getParentColumnCount
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество столбцов в родительской таблице.

    2.3.8.7. ForeignKey::getChildColumnCount()

    Описание. Получает количество столбцов в дочерней таблице этого ForeignKey.

    Сигнатура.

    unsigned getChildColumnCount
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество столбцов в дочерней таблице.

    2.3.8.8. ForeignKey::getParentIndex()

    Описание. 0, если дочерняя таблица ссылается на первичный ключ родительской таблицы.

    Сигнатура.

    const char* getParentIndex
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. См. описание.

    2.3.8.9. ForeignKey::getChildIndex()

    Описание. 0, если дочерние ссылки решены, используя первичный ключ дочерней таблицы.

    Сигнатура.

    const char* getChildIndex
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. См. описание.

    2.3.8.10. ForeignKey::getParentColumnNo()

    Описание. Этот метод получает порядковый номер колонки внешнего ключа в родительской таблице для данного индекса. См. документацию для Column::getColumnNo().

    Сигнатура.

    int getParentColumnNo
    (
      unsigned no
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Порядковый номер колонки.

    2.3.8.11. ForeignKey::getChildColumnNo()

    Описание. Этот метод получает порядковый номер колонки внешнего ключа в дочерней таблице для данного индекса. См. документацию для Column::getColumnNo().

    Сигнатура.

    int getChildColumnNo
    (
      unsigned no
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Порядковый номер колонки.

    2.3.8.12. ForeignKey::getOnUpdateAction()

    Описание. Получите действие ON UPDATE внешнего ключа. Это ForeignKey::FkAction и имеет одно из значений NoAction, Restrict, Cascade или SetNull.

    Сигнатура.

    FkAction getOnUpdateAction
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Порядковый номер колонки.

    2.3.8.13. ForeignKey::getOnDeleteAction()

    Описание.

    Описание. Получите действие ON DELETE внешнего ключа. Это ForeignKey::FkAction и имеет одно из значений NoAction, Restrict, Cascade или SetNull.

    Сигнатура.

    FkAction getOnDeleteAction
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Порядковый номер колонки.

    2.3.8.14. ForeignKey::setName()

    Описание. Определите имя экземпляра ForeignKey, для которого вызван метод.

    Сигнатура.

    void setName
    (
      const char*
    )
    

    Параметры. Имя ForeignKey.

    Возвращаемое значение. Нет.

    2.3.8.15. ForeignKey::setParent()

    Описание. Установить родительскую таблицу ForeignKey, учитывая ссылку на таблицу и произвольно индекс, чтобы использовать в качестве внешнего ключа.

    Сигнатура.

    void setParent
    (
      const Table&,
      const Index* index = 0,
      const Column* cols[] = 0
    )
    

    Параметры. Ссылка на Table. Произвольно индекс, используя обозначенную колонку или колонки.

    Возвращаемое значение. Нет.

    2.3.8.16. ForeignKey::setChild()

    Описание. Установите дочернюю таблицу ForeignKey, учитывая ссылку на таблицу и произвольно индекс, чтобы использовать в качестве внешнего ключа.

    Сигнатура.

    void setChild
    (
      const Table&,
      const Index* index = 0,
      const Column* cols[] = 0
    )
    

    Параметры. Ссылка на Table. Произвольно индекс, используя обозначенную колонку или колонки.

    Возвращаемое значение. Нет.

    2.3.8.17. ForeignKey::setOnUpdateAction()

    Описание. Установите действие ON UPDATE внешнего ключа.

    Сигнатура.

    void setOnUpdateAction
    (
      FkAction
    )
    

    Параметры. Действие ON UPDATE, которое будет выполнено. Это должно быть ForeignKey::FkAction с одним из значений NoAction, Restrict, Cascade или SetNull.

    Возвращаемое значение. Нет

    2.3.8.18. ForeignKey::setOnDeleteAction()

    Описание. Установите действие ON DELETE внешнего ключа.

    Сигнатура.

    void setOnUpdateAction
    (
      FkAction
    )
    

    Параметры. Действие ON DELETE, которое будет выполнено. Это должно быть ForeignKey::FkAction с одним из значений NoAction, Restrict, Cascade или SetNull.

    Возвращаемое значение. Нет

    2.3.8.19. ForeignKey::getObjectStatus()

    Описание. Получите статус объекта (см. раздел 2.3.31.4) для этого объекта ForeignKey.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Статус объекта ForeignKey как значение типа Object::Status. См. документацию этого типа для возможных значений и их интерпретации.

    2.3.8.20. ForeignKey::getObjectId()

    Описание. Получите идентификатор объекта (см. раздел 2.3.31.7) для данного объекта ForeignKey.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. ID объекта ForeignKey как возвращено Object::getObjectId().

    2.3.8.21. ForeignKey::getObjectVersion()

    Описание. Получите версию объекта (см. раздел 2.3.31.9) для этого объекта ForeignKey.

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Номер версии объекта ForeignKey (integer) как возвращено Object::getObjectVersion().

    2.3.9. Структура GetValueSpec

    Родительский класс. NdbOperation.

    Описание. Эта структура используется, чтобы определить дополнительное значение, чтобы получить как часть NdbRecord.

    Члены. Элементы, составляющие эту структуру, показаны в следующей таблице:

    Таблица 2.23.

    Имя Тип Описание
    column const Column* Чтобы определить дополнительное значение, чтобы читать, вызывающий должен обеспечить это, а также (произвольно NULL) указатель appStorage.
    appStorage void* Если этот указатель null, то полученное значение сохранено в памяти, управляемой объектом NdbRecAttr. Иначе полученное значение сохранено в местоположении, указанном (и все еще доступном с использованием объекта NdbRecAttr ). Обязанность вызывающего гарантировать, что следующие условия выполнены:

    1. appStorage указывает на достаточное место, чтобы сохранить любые возвращенные данные.

    2. Память, на которую указывает appStorage, не использована снова или освобождена до окончания execute().

    recAttr NdbRecAttr * После того, как операция определяется, recAttr содержит указатель на объект NdbRecAttr для получения данных.

    В настоящее время чтение blob не может быть определено, используя GetValueSpec.

    См. раздел 2.3.27.

    2.3.10. Класс HashMap

    Резюме

    Этот класс представляет хэш-карту в 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 не имеет публичных типов.

    2.3.10.1. Конструктор HashMap

    Описание. Конструктор класса HashMap не требует никаких аргументов. Конструктор копии также доступен.

    См. раздел 2.3.4.6.

    Сигнатура. Основной конструктор:

    HashMap HashMap
    (
      void
    )
    

    Конструктор копии:

    HashMap HashMap
    (
      const HashMap& hashmap
    )
    

    Деструктор:

    virtual ~HashMap
    (
      void
    )
    

    Параметры. Нет или адрес существующего объекта HashMap, который будет скопирован.

    Возвращаемое значение. Новый экземпляр HashMap, возможно копия существующего.

    2.3.10.2. HashMap::setName()

    Описание. Определяет имя хэш-карты.

    Сигнатура.

    void setName
    (
      const char* name
    )
    

    Параметры. Имя, которое будет назначено hashmap.

    Возвращаемое значение. Нет.

    2.3.10.3. HashMap::getName()

    Описание. Получает название хэш-карты.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название хэш-карты.

    2.3.10.4. HashMap::setMap()

    Описание. Назначает ряд значений карте.

    Сигнатура.

    void setMap
    (
      const Uint32* values,
      Uint32 len
    )
    

    Параметры. Указатель на ряд values длиной len.

    Возвращаемое значение. Нет.

    2.3.10.5. HashMap::getMapLen()

    Описание. Получает длину хэш-карты, то есть, количество значений, которые это содержит. Можно получить значения с использованием getMapValues().

    Сигнатура.

    Uint32 getMapLen
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Длина хэш-карты.

    2.3.10.6. HashMap::getMapValues()

    Описание. Получает значения из карты.

    Сигнатура.

    int getMapValues
    (
      Uint32* dst,
      Uint32 len
    ) const
    

    Параметры. Указатель на ряд значений (dst) и количество значений (len).

    Возвращаемое значение. 0 при успехе, при неудаче -1 и установит ошибку.

    2.3.10.7. HashMap::equal()

    Описание. Сравнивает (только) значения этой HashMap со значениями из другой.

    Сигнатура.

    bool equal
    (
      const HashMap& hashmap
    ) const
    

    Параметры. Ссылка на карту, с которой будет сравнена эта.

    Возвращаемое значение. Нет.

    2.3.10.8. HashMap::getObjectStatus()

    Описание. Этот метод получает статус HashMap для которой это вызвано. Возвращаемое значение имеет тип Object::Status.

    Сигнатура.

    virtual Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Возвращает текущий Status для HashMap .

    2.3.10.9. HashMap::getObjectVersion()

    Описание. Метод получает версию объекта схемы хэш-карты.

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Номер версии объекта integer.

    2.3.10.10. HashMap::getObjectId()

    Описание. Этот метод получает ID хэш-карты.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта integer.

    2.3.11. Класс Index

    Резюме

    Эта секция обеспечивает ссылку на класс 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().

    2.3.11.1. Конструктор класса индекса

    Описание. Это используется, чтобы создать новый экземпляр Index.

    Созданные с использованием API NDB индексы не видны MySQL Server.

    Сигнатура.

    Index
    (
      const char* name = ""
    )
    

    Параметры. Название нового индекса. Возможно создать индекс без имени, и затем назначить имя ему позже с использованием setName(). См. раздел 2.3.11.15.

    Возвращаемое значение. Новый экземпляр Index.

    Деструктор. Деструктор (~Index()) поставляется как виртуальный метод.

    2.3.11.2. Index::addColumn()

    Описание. Этот метод может использоваться, чтобы добавить колонку к индексу.

    Порядок столбцов соответствует порядку, в котором они добавляются к индексу. Однако это имеет значение только с упорядоченными индексами.

    Сигнатура.

    void addColumn
    (
      const Column& c
    )
    

    Параметры. Ссылка c к колонке, которая должна быть добавлена к индексу.

    Возвращаемое значение. Нет.

    2.3.11.3. Index::addColumnName()

    Описание. Этот метод работает таким же образом, как addColumn() за исключением того, что это берет название колонки в качестве параметра. Посмотрите раздел 2.3.11.5.

    Сигнатура.

    void addColumnName
    (
      const char* name
    )
    

    Параметры. Имя name колонки, которая будет добавлена к индексу как постоянный указатель на символ.

    Возвращаемое значение. Нет.

    2.3.11.4. Index::addColumnNames()

    Описание. Этот метод используется, чтобы добавить несколько имен столбцов к определению индекса.

    Как addColumn() и addColumnName(), индексы пронумерованы в порядке, в котором они были добавлены. Однако, это имеет значение только для упорядоченных индексов.

    Сигнатура.

    void addColumnNames
    (
      unsigned noOfNames,
      const char** names
    )
    

    Параметры. Этот метод берет два параметра, перечисленные здесь:

    • Количество столбцов и имен noOfNames для добавления к индексу.

    • Имена names для добавления к индексу (как указатель на указатель).

    Возвращаемое значение. Нет.

    2.3.11.5. Index::getColumn()

    Описание. Этот метод получает колонку в указанной позиции в индексе.

    Сигнатура.

    const Column* getColumn
    (
      unsigned no
    ) const
    

    Параметры. Порядковый номер позиции no колонки как unsigned integer. Используйте getNoOfColumns(), чтобы определить, сколько столбцов составляет индекс, см. раздел 2.3.11.8.

    Возвращаемое значение. Столбец, имеющий позицию no в индексе, как указатель на экземпляр Column . См. раздел 2.3.2.

    2.3.11.6. Index::getLogging()

    Описание. Используйте этот метод, чтобы определить, была ли регистрация на диск позволена для индекса.

    Индексы, которые не зарегистрированы, восстановлены, когда кластер запущен или перезапущен.

    Упорядоченные индексы в настоящее время не поддерживают регистрацию на диске, они восстановлены каждый раз, когда кластер запущен. Это включает перезапуски.

    Сигнатура.

    bool getLogging
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение.

    • true: Индекс регистрируется на диск.

    • false: Индекс не регистрируется на диск.

    2.3.11.7. Index::getName()

    Описание. Этот метод используется, чтобы получить название индекса.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название индекса, как постоянный указатель на символ.

    2.3.11.8. Index::getNoOfColumns()

    Описание. Этот метод используется, чтобы получить количество столбцов, составляющих индекс.

    Сигнатура.

    unsigned getNoOfColumns
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. unsigned integer, представляющий количество столбцов в индексе.

    2.3.11.9. Index::getObjectStatus()

    Описание. Этот метод получает статус объекта индекса.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. A Status, см. раздел 2.3.31.4.

    2.3.11.10. Index::getObjectVersion()

    Описание. Этот метод получает версию объекта индекса (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта индекса как integer.

    2.3.11.11. Index::getObjectId()

    Описание. Этот метод используется, чтобы получить идентификатор объекта индекса.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта как integer.

    2.3.11.12. Index::getTable()

    Описание. Этот метод может использоваться, чтобы получить название таблицы, которой принадлежит индекс.

    Сигнатура.

    const char* getTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название таблицы, как постоянный указатель на символ.

    2.3.11.13. Index::getType()

    Описание. Этот метод может использоваться, чтобы найти тип индекса.

    Сигнатура.

    Type getType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Тип индекса. Посмотрите раздел 2.3.11.18.

    2.3.11.14. Index::setLogging

    Описание. Этот метод используется, чтобы включить или отключить регистрацию индекса на диск.

    Сигнатура.

    void setLogging
    (
      bool enable
    )
    

    Параметры. setLogging() берет единственный булев параметр enable. Если enable = true, тогда регистрация позволена для индекса, если false, выключена.

    Возвращаемое значение. Нет.

    2.3.11.15. Index::setName()

    Описание. Этот метод определяет имя индекса.

    Это единственный метод Index::set*() , результат которого видим MySQL Server.

    Сигнатура.

    void setName
    (
      const char* name
    )
    

    Параметры. Желаемое имя name для индекса как постоянный указатель на символ.

    Возвращаемое значение. Нет.

    2.3.11.16. Index::setTable()

    Описание. Этот метод устанавливает таблицу, которая должна быть внесена в индекс. На таблицу ссылаются по имени.

    Сигнатура.

    void setTable
    (
      const char* name
    )
    

    Параметры. Имя name таблицы, которая будет внесена в индекс как постоянный указатель на символ.

    Возвращаемое значение. Нет.

    2.3.11.17. Index::setType()

    Описание. Этот метод используется, чтобы установить тип индекса.

    Сигнатура.

    void setType
    (
      Type type
    )
    

    Параметры. Тип type индекса, см. раздел 2.3.11.18.

    Возвращаемое значение. Нет.

    2.3.11.18. Index::Type

    Описание. Это перечислимый тип, который описывает вид индекса столбца, представленного экземпляром Index.

    Не путайте этот перечислимый тип с Object::Type или с Column::Type.

    Возможные значения.

    Таблица 2.26.

    Имя Описание
    Undefined Неопределенный тип объекта (начальная буква/значение по умолчанию)
    UniqueHashIndex Уникальный неупорядоченный хэш-индекс (только тип индекса поддержанный в настоящее время)
    OrderedIndex Групповой, упорядоченный индекс

    2.3.12. Структура IndexBound

    Родительский класс. 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.

    2.3.13. Класс LogfileGroup

    Резюме

    Эта секция обсуждает класс 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.

    2.3.13.1. Конструктор LogfileGroup

    Описание. Класс LogfileGroup имеет два публичных конструктора, один из которых не берет аргументов и создает абсолютно новый экземпляр. Другой конструктор копии.

    Класс Dictionary также поставляет методы для создания и разрушения объектов LogfileGroup, см. раздел 2.3.4.

    Сигнатуры. Новый экземпляр:

    LogfileGroup
    (
      void
    )
    

    Конструктор копии:

    LogfileGroup
    (
      const LogfileGroup& logfileGroup
    )
    

    Параметры. Создавая новый экземпляр, конструктор не берет параметров. Копируя существующий экземпляр, конструктору нужна ссылка на экземпляр LogfileGroup, который будет скопирован.

    Возвращаемое значение. Объект LogfileGroup.

    Деструктор.

    virtual ~LogfileGroup
    (
      void
    )
    

    2.3.13.2. LogfileGroup::getAutoGrowSpecification()

    Описание. Этот метод получает AutoGrowSpecification связанный с группой файла журнала.

    Сигнатура.

    const AutoGrowSpecification& getAutoGrowSpecification
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Структура данных AutoGrowSpecification, см. раздел 2.3.1.

    2.3.13.3. LogfileGroup::getName()

    Описание. Этот метод получает имя группы файла журнала.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя группы файла журнала, строка (как указатель на символ).

    2.3.13.4. LogfileGroup::getObjectId()

    Описание. Этот метод используется, чтобы получить идентификатор объекта группы файла журнала.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта файла журнала (integer).

    2.3.13.5. LogfileGroup::getObjectStatus()

    Описание. Этот метод используется, чтобы получить статус объекта LogfileGroup .

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Status группы файла журнала, см. раздел 2.3.31.4.

    2.3.13.6. LogfileGroup::getObjectVersion()

    Описание. Этот метод получает версию объекта файла журнала (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта кластера файла журнала как integer.

    2.3.13.7. LogfileGroup::getUndoBufferSize()

    Описание. Этот метод получает размер буфера UNDO.

    Сигнатура.

    Uint32 getUndoBufferSize
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Размер буфера UNDO в байтах.

    2.3.13.8. LogfileGroup::getUndoFreeWords()

    Описание. Этот метод получает число байтов, неиспользованных в буфере UNDO группы файла журнала.

    Сигнатура.

    Uint64 getUndoFreeWords
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Число свободных байтов как 64-bit integer.

    2.3.13.9. LogfileGroup::setAutoGrowSpecification()

    Описание. Этот метод устанавливает AutoGrowSpecification для группы файла журнала.

    Сигнатура.

    void setAutoGrowSpecification
    (
      const AutoGrowSpecification& autoGrowSpec
    )
    

    Параметры. Данные передаются как единственный параметр в виде структуры AutoGrowSpecification, см. раздел 2.3.1.

    Возвращаемое значение. Нет.

    2.3.13.10. LogfileGroup::setName()

    Описание. Этот метод используется, чтобы определить имя для группы файла журнала.

    Сигнатура.

    void setName
    (
      const char* name
    )
    

    Параметры. Имя name для группы файла журнала (указатель на символ).

    Возвращаемое значение. Нет.

    2.3.13.11. LogfileGroup::setUndoBufferSize()

    Описание. Этот метод может использоваться, чтобы установить размер буфера UNDO группы файла журнала.

    Сигнатура.

    void setUndoBufferSize
    (
      Uint32 size
    )
    

    Параметры. Размер size в байтах (32-bit unsigned integer).

    Возвращаемое значение. Нет.

    2.3.14. Класс List

    Резюме

    Эта секция покрывает класс 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.

    2.3.15. Структура Key_part_ptr

    Резюме

    Эта секция описывает структуру Key_part_ptr.

    Родительский класс. Ndb.

    Описание. Key_part_ptr обеспечивает удобный способ определить ключевые данные, запускаются транзакции и вычисляюются значения хэш-функции, передаваемые в указателях на значения ключа распределения. Когда у ключа распределения есть многократные части, они должны быть переданы как множество, причем последняя часть равна NULL. См. разделы 2.3.16.35 и 2.3.16.3.

    Атрибуты.

    Таблица 2.29.

    Атрибут Тип Начальное значение Описание
    ptr const void* Нет Указатель на одно или более значений ключа распределения
    len unsigned Нет Длина указателя

    2.3.16. Класс Ndb

    Резюме

    Этот класс представляет ядро 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

    2.3.16.1. Конструктор класса Ndb

    Описание. Это создает экземпляр 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. Это не требует никаких аргументов и любой специальной обработки.

    2.3.16.2. Ndb::closeTransaction()

    Описание. Это - один из двух методов API NDB, предусмотренных для закрытия транзакции (другой NdbTransaction::close()). Необходимо назвать один из этих двух методов, чтобы закончить транзакцию, как только это было закончено.

    Если транзакция еще не была передана, она прерывается, когда этот метод вызывают. Посмотрите раздел 2.3.16.35.

    Сигнатура.

    void closeTransaction
    (
      NdbTransaction *transaction
    )
    

    Параметры. Этот метод берет отдельный аргумент, указатель на транзакцию NdbTransaction.

    2.3.16.3. Ndb::computeHash()

    Описание. Этот метод может использоваться, чтобы вычислить значение хэш-функции распределения, учитывая таблицу и ее ключи.

    computeHash() может использоваться только для таблиц, использующих разделение NDB.

    Сигнатура.

    static int computeHash
    (
      Uint32* hashvalueptr,
      const NdbDictionary::Table* table,
      const struct Key_part_ptr*keyData,
      void* xfrmbuf = 0,
      Uint32 xfrmbuflen = 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.

    2.3.16.4. Ndb::createEventOperation()

    Описание. Этот метод создает подписку на событие базы данных.

    Подписки событий NDB API не сохраняются после того, как кластер NDB был восстановлен, используя ndb_restore, в таких случаях все подписки должны быть воссозданы явно.

    Сигнатура.

    NdbEventOperation* createEventOperation
    (
      const char *eventName
    )
    

    Параметры. Этот метод берет отдельный аргумент, уникальное имя eventName, идентифицирующее событие, на которое вы хотите подписаться.

    Возвращаемое значение. Указатель на объект NdbEventOperation (или NULL в случае неудачи). Посмотрите раздел 2.3.21.

    2.3.16.5. Ndb::dropEventOperation()

    Описание. Этот метод удаляет подписку на событие базы данных, представленное объектом NdbEventOperation.

    Память, используемая операцией события, которое было удалено, не освобождена, пока буфер событий не был полностью прочитан. Это означает, что необходимо продолжить вызывать pollEvents() и nextEvent() в таких случаях пока методы не вернут 0 и NULL, соответственно для этой памяти, которая будет освобождена.

    Сигнатура.

    int dropEventOperation
    (
      NdbEventOperation *eventOp
    )
    

    Параметры. Этот метод требует единственного входного параметра, указателя на экземпляр NdbEventOperation.

    Возвращаемое значение. 0 при успехе, любой другой результат указывает на неудачу.

    2.3.16.6. Ndb::getDictionary()

    Описание. Этот метод используется, чтобы получить объект для восстановления или управления информацией о схеме базы данных. Этот объект Dictionary содержит метаинформацию обо всех таблицах в кластере.

    Словарь, возвращенный этим методом, работает независимо от любой транзакции. См. раздел 2.3.4.

    Сигнатура.

    NdbDictionary::Dictionary* getDictionary
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Экземпляр класса Dictionary.

    2.3.16.7. Ndb::getDatabaseName()

    Описание. Этот метод может использоваться, чтобы получить название текущей базы данных.

    Сигнатура.

    const char* getDatabaseName
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Название текущей базы данных.

    2.3.16.8. Ndb::getDatabaseSchemaName()

    Описание. Этот метод может использоваться, чтобы получить текущее название схемы базы данных.

    Сигнатура.

    const char* getDatabaseSchemaName
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Название текущей схемы базы данных.

    2.3.16.9. Ndb::getGCIEventOperations()

    Описание. Проходит по отличным операциям событий, которые являются частью текущего 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, тогда после запроса метода это содержит битовую маску полученных типов событий.

    2.3.16.10. Ndb::get_eventbuf_max_alloc()

    Описание. Получает максимальную память в байтах, которая может использоваться для буфера событий. Это совпадает с чтением значения системной переменной MySQL Server ndb_eventbuffer_max_alloc.

    Добавлено в NDB 7.2.14 и NDB 7.3.3.

    Сигнатура.

    unsigned get_eventbuf_max_alloc
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Максимальная память, доступная для буфера событий, в байтах.

    2.3.16.11. Ndb::get_eventbuffer_free_percent()

    Описание. Получает 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, включая границы.

    Возвращаемое значение. Нет.

    2.3.16.12. Ndb::get_event_buffer_memory_usage()

    Описание. Получает использование буфера событий как процент ndb_eventbuffer_max_alloc. В отличие от get_eventbuffer_free_percent(), этот метод делает полную информацию об использовании доступной в форме структуры данных EventBufferMemoryUsage.

    Добавлено в NDB 7.4.3.

    Сигнатура.

    void get_event_buffer_memory_usage
    (
      EventBufferMemoryUsage&
    )
    

    Параметры. Ссылка на структуру EventBufferMemoryUsage, которая получает данные об использовании.

    Возвращаемое значение. Нет.

    2.3.16.13. Ndb::getHighestQueuedEpoch()

    Описание. Добавлено в NDB 7.4.3, этот метод заменяет устаревший getLatestGCI().

    До NDB 7.4.7 этот метод возвратил самый большой номер эпохи в очереди событий. В NDB 7.4.7 и позже это возвращает самый большой номер эпохи после запроса pollEvents2() (Bug #20700220).

    Сигнатура.

    Uint64 getHighestQueuedEpoch
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Новый номер эпохи, integer.

    2.3.16.14. Ndb::getLatestGCI()

    Описание. Получает индекс для новой глобальной контрольной точки.

    Этот метод устарел в NDB 7.4.3. В NDB 7.4.3 и позже необходимо использовать getHighestQueuedEpoch().

    Сигнатура.

    Uint64 getLatestGCI
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Новый GCI, integer.

    2.3.16.15. Ndb::getNdbError()

    Описание. Этот метод предоставляет вам два различных способа получить объект 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.

    2.3.16.16. Ndb::getNdbErrorDetail()

    Описание. Этот метод обеспечивает легкий и безопасный способ получить доступ к любой дополнительной информации об ошибке, вместо того, чтобы читать эти дополнительные детали от объекта 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,
      Uint32 bufferLength
    ) const
    

    Параметры. Чтобы получить подробную информацию об ошибке, вызовите getNdbErrorDetail() со ссылкой на объект NdbError, buffer и длину этого буфера (unsigned 32-bit integer).

    Возвращаемое значение. Когда дополнительные детали о error доступны, этот метод возвращает указатель на начало поставляемого буфера buffer. Как указано ранее, если последовательность, содержащая детали, более длинна, чем bufferLength, последовательность усечена, чтобы соответствовать. Если никакие дополнительные детали недоступны, getNdbErrorDetail() вернет NULL.

    2.3.16.17. Ndb::getNdbObjectName()

    Описание. Если имя было определено для объекта Ndb до его инициализации, можно получить его, используя этот метод. Используемый для отладки.

    Сигнатура.

    const char* getNdbObjectName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя объекта Ndb, если было установлено, используя setNdbObjectName(). Иначе 0.

    Добавлено в NDB 7.2.17 и NDB 7.3.6 (Bug #18419907).

    2.3.16.18. Ndb::getNextEventOpInEpoch2()

    Описание. Проходит по операциям по одиночным событиям, составляющим текущую глобальную контрольную точку. Используйте следующий nextEvent2(), чтобы получить итоговую информацию в течение эпохи, такую как список всех таблиц, прежде, чем обработать данные о событии.

    Исключительные эпохи не начинают операций событий, связанных с ними.

    Сигнатура.

    const NdbEventOperation* getNextEventOpInEpoch2
    (
      Uint32* iter,
      Uint32* event_types
    )
    

    Параметры. Первоначально задайте iter = 0, это NULL, когда больше нет событий в течение этой эпохи. Если event_types не NULL, это считает битовую маску типов событий полученной.

    Возвращаемое значение. Указатель на следующий NdbEventOperation, если он есть.

    2.3.16.19. Ndb::getNextEventOpInEpoch3()

    Описание. Проходит по операциям по одиночным событиям, составляющим текущую глобальную контрольную точку. Используйте следующий 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).

    2.3.16.20. Ndb::getReference()

    Описание. Этот метод может использоваться, чтобы получить ссылку на данный объект Ndb . Это то же самое значение, которое возвращено для данной операции, соответствующей этому объекту в выводе DUMP 2350.

    Сигнатура.

    Uint32 getReference
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit unsigned integer.

    2.3.16.21. Ndb::init()

    Описание. Этот метод используется, чтобы инициализировать объект Ndb.

    Сигнатура.

    int init
    (
      int maxNoOfTransactions = 4
    )
    

    Параметры. Метод init() берет единственный параметр maxNoOfTransactions типа integer. Этот параметр определяет максимальное количество параллельных объектов NdbTransaction, которые могут быть обработаны этим экземпляром Ndb. Максимальное разрешенное значение для value for maxNoOfTransactions = 1024, по умолчанию 4.

    Каждая операция по просмотру или индексу использует дополнительный объект NdbTransaction.

    Возвращаемое значение. Этот метод возвращает int, который может иметь любой следующие два значения:

    • 0: указывает, что объект Ndb был инициализирован успешно.

    • -1: указывает на ошибку.

    2.3.16.22. Ndb::isConsistent()

    Описание. Проверяет, последовательны ли все события. Если сбой узла происходит, когда ресурсы исчерпаны, события могут быть потеряны и поставленные данные о событии могли бы таким образом быть неполными. Этот метод позволяет определить это.

    Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого использовать NdbEventOperation::getEventType2(), чтобы определить тип события в этом экземпляре, имеет ли событие тип TE_INCONSISTENT. См. раздел 2.3.6.23.

    Сигнатура.

    bool isConsistent
    (
      Uint64& gci
    )
    

    Параметры. Ссылка на глобальный индекс контрольной точки. Это первый непоследовательный найденный GCI, если таковые имеются.

    Возвращаемое значение. true, если все события последовательны.

    2.3.16.23. Ndb::isConsistentGCI()

    Описание. Если сбой узла происходит, когда ресурсы исчерпаны, события могут быть потеряны и поставленные данные о событии могли бы таким образом быть неполными. Этот метод позволяет определить это проверяя, последовательны ли все события в данном 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 может быть непоследовательным.

    2.3.16.24. Ndb::isExpectingHigherQueuedEpochs()

    Описание. Проверяет были ли эпохи с очередями выше замечены последним вызовом 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(), или в случае сбоя кластера.

    2.3.16.25. Ndb::nextEvent()

    Описание. Возвращает следующую операцию событий, имеющую данные из подписной очереди.

    Устарело в 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).

    2.3.16.26. Ndb::nextEvent2()

    Описание. Возвращает операцию событий, связанную с данными, из очереди событий. Это нужно вызывать неоднократно после того, как 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.

    2.3.16.27. Ndb::pollEvents()

    Описание. Этот метод ждет 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
    (
      int maxTimeToWait,
      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() выходит из процесса.

    2.3.16.28. Ndb::pollEvents2()

    Описание. Ждет события. Срабатывает как только любые данные о событии доступны. Этот метод также перемещает полные данные о событии эпохи в очередь событий.

    Добавлено в NDB 7.4.3, этот метод заменяет устаревший pollEvents().

    Сигнатура.

    int pollEvents2
    (
      int aMillisecondNumber,
      Uint64* highestQueuedEpoch = 0
    )
    

    Параметры. Этот метод берет эти два параметра, перечисленные здесь:

    • Максимальное время, чтобы ждать, в миллисекундах, перед отказом и сообщая, что никакие события не были доступны (то есть, прежде чем метод автоматически возвращает 0).

      В NDB 7.4.7 и позже, определяя отрицательную величину для этого аргумента, pollEvents2() возвращает -1, указывая на ошибку (Bug #20762291).

    • Индекс самой высокой эпохи с очередями. Обычно этому можно безопасно разрешить принять значение по умолчанию, которое является 0. Если это значение не NULL и новые данные о событии доступны в очереди событий, оно установлено в самую высокую эпоху, найденную в доступных данных о событии.

    Возвращаемое значение. pollEvents2() вернет integer:

    • > 0: Есть события, доступные в очереди.

    • 0: Нет никаких доступных событий.

    • < 0: Указывает на неудачу (возможная ошибка).

    2.3.16.29. Ndb::setDatabaseName()

    Описание. Этот метод используется, чтобы определить имя текущей базы данных.

    Сигнатура.

    void setDatabaseName
    (
      const char *databaseName
    )
    

    Параметры. setDatabaseName() берет единственный обязательный параметр, название новой базы данных, которая будет установлена как текущая база данных.

    2.3.16.30. Ndb::setDatabaseSchemaName()

    Описание. Этот метод определяет имя текущей схемы базы данных.

    Сигнатура.

    void setDatabaseSchemaName
    (
      const char *databaseSchemaName
    )
    

    Параметры. Название схемы базы данных.

    2.3.16.31. Ndb::setEventBufferQueueEmptyEpoch()

    Описание. Организация очереди пустых эпох отключена по умолчанию. Этот метод может использоваться, чтобы позволить такую организацию очереди, в этом случае любые новые пустые эпохи, входя в буфер событий после вызова метода, стоят в очереди.

    Когда организация очереди пустых эпох позволена, nextEvent() связывает пустую эпоху с одной и только одной из подписок (операции событий), связанной с подпиской объекта Ndb. Это означает, что может быть не больше, чем одна пустая эпоха на подписку, даже при том, что у пользователя может быть много подписок, связанных с тем же самым объектом Ndb.

    Сигнатура.

    void setEventBufferQueueEmptyEpoch
    (
      bool queue_empty_epoch
    )
    

    Параметры. Этот метод берет единственный входной параметр. Вызов метода с true позволяет стоять в очереди пустым событиям, false отключает такую организацию очереди.

    Возвращаемое значение. Нет.

    setEventBufferQueueEmptyEpoch() не имеет никакого связанного метода получателя. Это намерено и происходит из-за того, что этот сеттер обращается к стоящим в очереди новым эпохам, тогда как сама очередь может все еще отразить положение дел, которое существовало до вызыва сеттера. Таким образом, во время переходного периода, пустая эпоха могла бы быть найдена в очереди, даже если такая организация очереди выключена.

    setEventBufferQueueEmptyEpoch() добавлен в NDB 7.4.11 и NDB 7.5.2.

    2.3.16.32. Ndb::set_eventbuf_max_alloc()

    Описание. Устанавливает максимальную память в байтах, которая может использоваться для буфера событий. Это имеет тот же самый эффект как установка значения системной переменной MySQL Server ndb_eventbuffer_max_alloc.

    Добавлено в NDB 7.2.14 и NDB 7.3.3.

    Сигнатура.

    void set_eventbuf_max_alloc
    (
      unsigned size
    )
    

    Параметры. Желаемый максимум size для буфера событий в байтах.

    Возвращаемое значение. Нет.

    2.3.16.33. Ndb::set_eventbuffer_free_percent()

    Описание. Устанавливает переменную ndb_eventbuffer_free_percent то есть, процент буферной памяти событий, которая должна быть доступной прежде, чем продолжить буферизовать после достижения ndb_eventbuffer_max_alloc.

    Добавлено в NDB 7.4.3.

    Сигнатура.

    int set_eventbuffer_free_percent
    (
      unsigned pct
    )
    

    Параметры. Процент (pct) буферной памяти событий, которая должна присутствовать. Действительный диапазон равняется 1-99 включительно.

    Возвращаемое значение. Значение, которое было установлено.

    2.3.16.34. Ndb::setNdbObjectName()

    Описание. Начиная с NDB 7.2.17 и NDB 7.3.6, можно определить произвольное, человекочитаемое имя, чтобы определить объект Ndb при отладке. Это имя может тогда быть получено, используя getNdbObjectName() (Bug #18419907). Это должно быть сделано до запроса init() для этого объекта, пытаясь определить имя после, инициализация терпит неудачу с ошибкой.

    Можно определить имя только однажды для данного объекта Ndb, последующие попытки после определения имени терпят неудачу с ошибкой.

    Сигнатура.

    int setNdbObjectName
    (
      const char* name
    )
    

    Параметры. Имя name.

    Возвращаемое значение. 0 при успехе.

    2.3.16.35. Ndb::startTransaction()

    Описание. Этот метод используется, чтобы начать новую транзакцию. Есть три варианта, самый простой из них, используя таблицу и ключ разделения или 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,
      Uint32 xfrmbuflen = 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,
      Uint32 partitionId
    )
    

    Если у кластера есть то же самое количество узлов данных, как реплик, определение операционного координатора не получает улучшения работы, так как каждый узел данных содержит всю базу данных. Однако, где количество узлов данных больше, чем количество реплик (например, где NoOfReplicas = 2 в кластере с 4 узлами данных), вы увидите улучшение работы при помощи осведомленной о распределении версии этого метода.

    Все еще возможно использовать этот метод как прежде, не определяя операционного координатора. В любом случае необходимо все еще явно закрыть транзакцию, независимо от успешности вызова startTransaction().

    Возвращаемое значение. При успехе вернет объект NdbTransaction, при ошибке вернет NULL.

    2.3.17. Класс Ndb_cluster_connection

    Резюме

    Этот класс представляет связь с кластером узлов данных.

    Родительский класс. Нет.

    Дочерние классы. Нет.

    Описание. Прикладная программа 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, используя Ndb_cluster_connection

    get_latest_error()

    Действительно ли новая попытка соединиться успешна

    get_latest_error_msg()

    Если новая попытка соединиться провалилась, обеспечивает причину

    get_max_adaptive_send_time()

    Тайм-аут перед адаптивной отправкой всех сигналов

    get_num_recv_threads()

    Количество потоков получения

    get_next_ndb_object()

    Используемый, чтобы повторить кратное число объектов Ndb.

    get_recv_thread_activation_threshold()

    Получить уровень активации для связанного потока получения

    get_system_name()

    Получите имя системы кластера

    lock_ndb_objects()

    Отключает создание новых объектов Ndb

    set_auto_reconnect()

    Позволяет или отключает повторное автосоединение с узлами API, используя Ndb_cluster_connection

    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()

    Позволяет создание новых объектов Ndb

    unset_recv_thread_cpu()

    Сброс привязки потока получения к CPU

    wait_until_ready() Ждет, пока связь с одним или более узлами данных не будет успешной

    2.3.17.1. Конструктор класса Ndb_cluster_connection

    Описание. Этот метод создает связь с кластером 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,
      int force_api_nodeid
    )
    

    Параметры. Эта версия конструктора берет два аргумента: connection_string и ID узла (force_api_nodeid), используемый этим узлом API. Этот ID узла отвергает любое значение идентификатора узла, заданное connection_string.

    Возвращаемое значение. Обе версии: Экземпляр Ndb_cluster_connection.

    2.3.17.2. Ndb_cluster_connection::connect()

    Описание. Этот метод соединяется с сервером управления кластера.

    Сигнатура.

    int connect
    (
      int retries = 30,
      int delay = 1,
      int verbose = 0
    )
    

    Параметры. Этот метод берет три параметра, все из которых дополнительные:

    • retries определяет число раз, чтобы повторить связь в случае неудачи. Значение по умолчанию равняется 30.

      0 означает, что никакие дополнительные попытки соединиться не предприняты в случае неудачи, использование отрицательной величины для retries приводит к бесконечным попыткам подключения.

    • delay представляет число секунд между повторными попытками подключения, по умолчанию 1 секунда.

    • verbose указывает, должен ли метод произвести сообщение о своем прогрессе: 1 = да, 0 (по умолчанию) = нет.

    Возвращаемое значение. Этот метод возвращает int, у которого может быть одно из следующих 3 значений:

    • 0: Попытка подключения была успешна.

    • 1: Указывает на исправимую ошибку.

    • -1: Указывает на невосстанавливаемую ошибку.

    2.3.17.3. Ndb_cluster_connection::get_auto_reconnect()

    Описание. Этот метод получает текущее значение AutoReconnect для данного a given Ndb_cluster_connection. Для более подробной информации посмотрите раздел 2.3.17.12.

    Сигнатура.

    int get_auto_reconnect
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. integer 0 или 1, соответствующее текущему AutoReconnect для этой связи. 0 предписывает узлам API использовать новые связи с кластером в то время, как 1 позволяет узлам API снова использовать существующие связи.

    2.3.17.4. Ndb_cluster_connection::get_latest_error()

    Описание. Этот метод может использоваться, чтобы определить действительно ли новая попытка 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.

    2.3.17.5. Ndb_cluster_connection::get_latest_error_msg()

    Описание. Если новая попытка подключения этим Ndb_cluster_connection провалилась (как определено, вызывая get_latest_error()), этот метод предоставляет сообщение об ошибке, поставляющее информацию о причине неудачи.

    Сигнатура.

    const char* get_latest_error_msg
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Последовательность, содержащая сообщение об ошибке, описывающее неудачу Ndb_cluster_connection::connect(). Если новая попытка подключения имела успех, пустая строка возвращена.

    2.3.17.6. Ndb_cluster_connection::get_max_adaptive_send_time()

    Описание. Получите минимальное время в миллисекундах до того, как механизм адаптивной передачи пошлет все сигналы.

    Сигнатура.

    Uint32 get_max_adaptive_send_time ()
    

    Параметры. Нет.

    Возвращаемое значение. Время ожидания в миллисекундах. Это должно всегда быть значением между 0 и 10 включительно.

    2.3.17.7. Ndb_cluster_connection::get_next_ndb_object()

    Описание. Этот метод используется, чтобы итерировать набор объектов Ndb, получая их по одному.

    Сигнатура.

    const Ndb* get_next_ndb_object
    (
      const Ndb* p
    )
    

    Параметры. Этот метод берет единственный параметр, указатель на последний объект Ndb , который был получен или NULL.

    Возвращаемое значение. Возвращает следующий объект Returns the next Ndb или NULL, если больше нет объектов Ndb.

    Итерирование объектов Ndb. Чтобы получить все существующие объекты Ndb, выполните следующее:

    1. Вызовите метод lock_ndb_objects(). Это предотвращает создание любых новых экземпляров Ndb до вызова unlock_ndb_objects().

    2. Получите первый доступный Ndb, передав NULL в get_next_ndb_object(). Можно получить второй объект Ndb, передавая указатель, полученный первым вызовом, следующему get_next_ndb_object() и т.д. Когда указатель на последний доступный экземпляр Ndb используется, метод вернет NULL.

    3. После того, как вы получили все желаемые объекты Ndb, необходимо повторно включить создание объектов Ndb вызовом метода unlock_ndb_objects().

    2.3.17.8. Ndb_cluster_connection::get_num_recv_threads()

    Описание. Получите количество потоков приемника.

    Сигнатура.

    int get_num_recv_threads
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество потоков приемника.

    2.3.17.9. Ndb_cluster_connection::get_recv_thread_activation_threshold()

    Описание. Получить уровень для активации потока приемника, связанного set_recv_thread_cpu().

    Сигнатура.

    int get_recv_thread_activation_threshold
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Пороговое значение как integer. См. раздел 2.3.17.18.

    2.3.17.10. Ndb_cluster_connection::get_system_name()

    Описание. Получает имя системы от кластерной конфигурации. Это значение параметра конфигурации системы Name устанавливается в конфигурационном файле config.ini.

    Сигнатура.

    const char* get_system_name
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя кластерной системы. Если не задано в файле кластерной конфигурации, это произведенное значение в форме MC_timestamp (например, MC_20170426182343), используя время, когда сервер управления был запущен.

    2.3.17.11. ndb_cluster_connection::lock_ndb_objects()

    Описание. Запрос этого метода предотвращает создание новых экземпляров класса 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.

    2.3.17.12. Ndb_cluster_connection::set_auto_reconnect()

    Описание. Узел 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 снова использовать существующие связи с кластером.

    Возвращаемое значение. Нет.

    2.3.17.13. Ndb_cluster_connection::set_data_node_neighbour()

    Описание. Устанавливает окружение узла данных, используемое для оптимального размещения операционного координатора. Этот метод используется после создания 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 узла, который будет использоваться в качестве соседа.

    Возвращаемое значение. Нет.

    2.3.17.14. Ndb_cluster_connection::set_max_adaptive_send_time()

    Описание. Установите минимальное время в миллисекундах, которое адаптивный механизм передачи ждет прежде чем послать все сигналы.

    Сигнатура.

    void set_max_adaptive_send_time
    (
      Uint32 milliseconds
    )
    

    Параметры. Время ожидания в миллисекундах. Диапазон 0-10, по умолчанию 10.

    Возвращаемое значение. Нет.

    2.3.17.15. Ndb_cluster_connection::set_name()

    Описание. Определяет имя для связи. Если имя определяется, о нем сообщают в регистрации кластера.

    Сигнатура.

    void set_name
    (
      const char* name
    )
    

    Параметры. Имя name, которое будет использоваться в качестве идентификатора для связи.

    Возвращаемое значение. Нет.

    2.3.17.16. Ndb_cluster_connection::set_num_recv_threads()

    Описание. Определите число потоков приемника, связанных с CPU, определенное использованием set_recv_thread_cpu() с порогом, установленным set_recv_thread_activation_threshold().

    Этот метод должен быть вызван прежде, чем попытаться соединиться с любыми другими узлами.

    Сигнатура.

    int set_num_recv_threads
    (
      Uint32 num_recv_threads
    )
    

    Параметры. Количество потоков. Единственное поддержанное значение 1.

    Возвращаемое значение. -1 указывает на ошибку, любое другое значение указывает на успех.

    2.3.17.17. Ndb_cluster_connection::set_optimized_node_selection()

    Описание. Этот метод может использоваться, чтобы отвергнуть поведение метода connect() по умолчанию, в отношении которого узел должен быть связан сначала.

    Сигнатура.

    void set_optimized_node_selection
    (
      int value
    )
    

    Параметры. integer value.

    Возвращаемое значение. Нет.

    2.3.17.18. Ndb_cluster_connection::set_recv_thread_activation_threshold()

    Описание. Установите уровень для активации потока приемника, связанного с помощью set_recv_thread_cpu(). Ниже этого уровня потоки обычного пользователя используются, чтобы получить сигналы.

    Сигнатура.

    int set_recv_thread_activation_threshold
    (
      Uint32 threshold
    )
    

    Параметры. integer threshold . 16 или более высокие значения означают, что потоки получения никогда не используются в качестве приемников. 0 указывает, что поток получения всегда активна, это сохраняет права опроса для его собственного исключительного использования, эффективно блокируя все пользовательские потоки от становления приемниками. В таких случаях нужно соблюдать аккуратность, чтобы гарантировать, что поток получения не конкурирует с пользовательским потоком за ресурсы CPU, предпочтительно для него быть привязанным к CPU для его собственного исключительного использования. По умолчанию значение 8.

    Возвращаемое значение. -1 указывает на ошибку, любое другое значение указывает на успех.

    2.3.17.19. Ndb_cluster_connection::set_service_uri()

    Описание. Начиная с 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,
      int port,
      const char* path
    )
    

    Параметры. Этот метод берет параметры, перечисленные здесь:

    • scheme: Схема URI. Это ограничено к строчным буквам, числам и знакам ., + и -. Максимальная длина 16 знаков, любые знаки сверх этого предела усечены.

    • host: Адрес сети URI или имя хоста. Максимальная длина 48 знаков (достаточно для адреса сети IPv6), любые знаки сверх этого предела усечены. Если ноль, каждый узел данных сообщает о сетевом адресе от своей собственной связи до этого узла. Ndb_cluster_connection, который использует многократные транспортеры или сетевые адреса, чтобы соединиться с различными узлами данных, отражен в многократных строках таблицы ndbinfo.processes.

    • port: Порт URI. Это не издается, если это равно 0.

    • path: Путь URI, возможно сопровождаемый началом строки запроса с ?. Максимальная объединенная длина пути и запроса не может превысить 128 знаков.

      Путь не может начаться с двойного слэша (//).

    Возвращаемое значение. 0 при успехе, 1 в случае синтаксической ошибки.

    2.3.17.20. Ndb_cluster_connection::set_recv_thread_cpu()

    Описание. Установите CPU, с которым должен быть связан поток приемника. Установите уровень для активации потока приемника, вызвав set_recv_thread_activation_threshold(). Сбросьте привязку потока вызовом unset_recv_thread_cpu().

    Сигнатура.

    int set_recv_thread_cpu
    (
      Uint16* cpuid_array,
      Uint32 array_len,
      Uint32 recv_thread_id = 0
    )
    

    Параметры.

    • Множество из одного или более CPU ID, с которыми должен быть связан поток получения

    • Длина этого множества

    • ID потока получения для привязки, по умолчанию 0.

    Возвращаемое значение. -1 указывает на ошибку, любое другое значение указывает на успех.

    2.3.17.21. Ndb_cluster_connection::set_timeout()

    Описание. Используемый, чтобы установить тайм-аут для связи, ограничить количество времени, которое мы можем заблокировать, соединяясь.

    Этот метод на самом деле обертка для функции ndb_mgm_set_timeout(), см. see раздел 3.2.4.12.

    Сигнатура.

    int set_timeout
    (
      int timeout_ms
    )
    

    Параметры. Длина тайм-аута в миллисекундах (timeout_ms). В настоящее время приняты только кратные 1000 значения.

    Возвращаемое значение. 0 при успехе, любое другое значение указывает на ошибку.

    2.3.17.22. Ndb_cluster_connection::unlock_ndb_objects()

    Описание. Этот метод отменяет эффекты 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.

    2.3.17.23. Ndb_cluster_connection::unset_recv_thread_cpu()

    Описание. Сбросить CPU, к которым привязан поток получения, используя set_recv_thread_cpu().

    Сигнатура.

    int unset_recv_thread_cpu
    (
      Uint32 recv_thread_id
    )
    

    Параметры. ID потока получения.

    Возвращаемое значение. -1 указывает ошибку, любое другое значение указывает на успех.

    2.3.17.24. Ndb_cluster_connection::wait_until_ready()

    Описание. Этот метод необходим, чтобы установить связи с узлами данных. Это ждет, пока требуемая связь с одним или более узлами данных не будет успешна, или пока не кончится тайм-аут.

    Сигнатура.

    int wait_until_ready
    (
      int timeoutBefore,
      int timeoutAfter
    )
    

    Параметры.

    • timeoutBefore определяет число секунд, чтобы ждать, пока первый живой узел будет найден. Если это количество времени превышено без обнаруженных живых узлов, то метод немедленно возвращает отрицательную величину.

    • timeoutAfter определяет число секунд, чтобы ждать после того, как первый живой узел будет обнаружен для всех узлов, чтобы стать активным. Если это количество времени превышено без получения активного узла, то метод немедленно возвращает значение больше 0.

    Возвращаемое значение. wait_until_ready() вернет int, чье значение интерпретируется следующим образом:

    • = 0: все узлы живые.

    • > 0: По крайней мере один узел живой (однако, неизвестно, живы ли все узлы).

    • < 0: Ошибка произошла.

    2.3.18. Класс NdbBlob

    Резюме

    Этот класс представляет обработчик столбца 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.

    2.3.18.1. NdbBlob::ActiveHook

    Резюме

    ActiveHook это тип данных, определенный для использования в качестве отзыва для метода setActiveHook(), см. раздел 2.3.18.17.

    Определение. ActiveHook это пользовательский тип данных, определенный так:

    typedef int ActiveHook
    (
      NdbBlob* me,
      void* arg
    )
    

    Описание. Это отзыв для NdbBlob::setActiveHook(), немедленно вызван, как только подготовленная операция была выполнена (но не передана). Любые вызовы getValue() или setValue() выполняются сначала. Обработчик BLOB активен, так что readData() или writeData() могут использоваться, чтобы управлять значением BLOB. Определенный пользователями аргумент передается вместе с NdbBlob. setActiveHook() вернет ненулевое значение в случае ошибки.

    2.3.18.2. NdbBlob::blobsFirstBlob()

    Описание. Этот метод инициализирует список blob, принадлежащих текущей операции, и возвращает первый blob в списке.

    Сигнатура.

    NdbBlob* blobsFirstBlob
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на желаемый blob.

    2.3.18.3. NdbBlob::blobsNextBlob()

    Описание. Используйте метод, чтобы получить следующий в списке blob. См. раздел 2.3.18.2 .

    Сигнатура.

    NdbBlob* blobsNextBlob
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на желаемый blob.

    2.3.18.4. NdbBlob::close()

    Описание. Закрывает обработчик, высвобождая внутренние средства до совершения или прерывания транзакции. Другими словами, это сигнализирует, что приложение закончило с чтением от данного 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 при успехе.

    2.3.18.5. NdbBlob::getBlobEventName()

    Описание. Этот метод получает имя события blob. Событие создается, если главное событие контролирует колонку blob. Имя включает главное имя события.

    Сигнатура.

    static int getBlobEventName
    (
      char* name,
      Ndb* ndb,
      const char* event,
      const char* column
    )
    

    Параметры.

    • Название события name.

    • ndb: Соответствующий объект Ndb.

    • event: Название главного события.

    • column: Столбец blob.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.6. NdbBlob::getBlobTableName()

    Описание. Этот метод получает название таблицы сегментов данных blob.

    Этот метод обычно имеет использование только для тестирования и отладки.

    Сигнатура.

    static int getBlobTableName
    (
      char* name,
      Ndb* ndb,
      const char* table,
      const char* column
    )
    

    Параметры.

    • name: Название таблицы сегментов данных blob.

    • ndb: Соответствующий объект Ndb.

    • table: Название главной таблицы.

    • column: Столбец blob.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.18.7. NdbBlob::getColumn()

    Описание. Используйте этот метод, чтобы получить столбец BLOB, который принадлежит NdbBlob.

    Сигнатура.

    const Column* getColumn
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Объект Column. См. раздел 2.3.2.

    2.3.18.8. NdbBlob::getLength()

    Описание. Этот метод получает текущую длину blob в байтах.

    Сигнатура.

    int getLength
    (
      Uint64& length
    )
    

    Параметры. Ссылка на длину.

    Возвращаемое значение. Длина blob в байтах. Для NULL этот метод вернет 0. Чтобы отличить blob длины 0, используйте getNull().

    2.3.18.9. NdbBlob::getNull()

    Описание. Этот метод проверяет, является ли значение NULL.

    Сигнатура.

    int getNull
    (
      int& isNull
    )
    

    Параметры. Ссылка на integer isNull. У этого параметра есть одно из следующих значений, интерпретируемых как показано здесь:

    • -1: blob не определен. Если это blob без события, этот результат вызывает статусную ошибку.

    • 0: blob не null.

    • 1: blob = NULL.

    Возвращаемое значение. Нет.

    2.3.18.10. NdbBlob::getNdbError()

    Описание. Используйте этот метод, чтобы получить ошибочный объект. Ошибка может быть определенной для blob или может быть скопирована с неудавшейся неявной операции. Код ошибки копируется назад к операции, если у операции уже нет кода ошибки отличного от нуля.

    Сигнатура.

    const NdbError& getNdbError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Объект NdbError , см. раздел 2.3.20.

    2.3.18.11. NdbBlob::getNdbOperation()

    Описание. Этот метод может использоваться, чтобы найти операцию с который связан обработчик для этого NdbBlob.

    Сигнатура.

    const NdbOperation* getNdbOperation
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на операцию.

    Операция, на которую ссылается указатель, возвращенный этим методом, может быть представлена любым объектом NdbOperation или NdbScanOperation.

    См. разделы 2.3.25 и 2.3.29.

    2.3.18.12. NdbBlob::getPos()

    Описание. Этот метод получает текущее положение чтения-записи в blob.

    Сигнатура.

    int getPos
    (
      Uint64& pos
    )
    

    Параметры. Один параметр, ссылка на положение.

    Возвращаемое значение. 0 при успехе или -1 при неудаче. После успешного вызова pos займет текущую позицию чтения-записи в blob.

    2.3.18.13. NdbBlob::getState()

    Описание. Этот метод получает текущее состояние объекта NdbBlob, для которого это вызвано. Возможные статусы описаны в разделе 2.3.18.21.

    Сигнатура.

    State getState
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Значение State. См. раздел 2.3.18.21.

    2.3.18.14. NdbBlob::getValue()

    Описание. Используйте этот метод, чтобы подготовиться читать значение blob, значение доступно следующим вызовом. Используйте getNull(), чтобы проверять на NULL, getLength(), чтобы получить фактическую длину blob и проверить на усечение. getValue() устанавливает текущее положение чтения-записи в пункт после конца данных, которые были прочитаны.

    Сигнатура.

    int getValue
    (
      void* data,
      Uint32 bytes
    )
    

    Параметры. Этот метод берет два параметра. Первым из них является указатель на data для чтения, вторым является количество bytes.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.15. NdbBlob::getVersion()

    Описание. Этот метод используется, чтобы различать, основана ли на запросе или на событии операция по blob.

    Сигнатура.

    void getVersion
    (
      int& version
    )
    

    Параметры. Этот метод берет единственный параметр, ссылку на integer на версию blob (операционный тип).

    Возвращаемое значение.

    • -1: Это нормальный (основанный на запросе) blob.

    • 0: Это базирующийся на операции событий blob после изменения в его данных.

    • 1: Это базирующийся на операции событий blob до любого изменения в его данных.

    getVersion() всегда успешно, предполагая, что это вызвано как метод действительного экземпляра NdbBlob.

    2.3.18.16. NdbBlob::readData()

    Описание. Этот метод используется, чтобы прочитать данные из blob.

    Сигнатура.

    int readData
    (
      void* data,
      Uint32&bytes
    )
    

    Параметры. readData() принимает указатель на data для чтения и ссылку на количество bytes.

    Возвращаемое значение. 0 при успехе, -1 при ошибке. После успешного вызова data указывает на данные, которые были прочитаны, а bytes считает число байтов.

    2.3.18.17. NdbBlob::setActiveHook()

    Описание. Этот метод определяет отзыв для активации обработчика blob. Очередь подготовленных операций будет выполнена в непередаваемом режиме до этого пункта, затем отзыв вызван. Для получения дополнительной информации посмотрите раздел 2.3.18.1.

    Сигнатура.

    int setActiveHook
    (
      ActiveHook* activeHook,
      void* arg
    )
    

    Параметры.

    • Указатель на значение ActiveHook, это отзыв, как объяснено в разделе 2.3.18.1.

    • Указатель на void для любых данных, которые будут переданы отзыву.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.18. NdbBlob::setNull()

    Описание. Этот метод устанавливает значение blob = NULL.

    Сигнатура.

    int setNull
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.19. NdbBlob::setPos()

    Описание. Этот метод устанавливает положение, в котором можно прочитать или написать данные.

    Сигнатура.

    int setPos
    (
      Uint64 pos
    )
    

    Параметры. Метод setPos() берет единственный параметр pos (unsigned 64-bit integer), который является положением для чтения или написания данных. Значение pos должно быть между 0 и текущей длиной blob.

    Sparse blob не поддерживаются в API NDB, другими словами, не может быть никаких неиспользованных положений данных.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.20. NdbBlob::setValue()

    Описание. Этот метод используется, чтобы подготовиться к вставке или обновлению blob. Любые существующие данные, которые более длинны, чем новые данные, усечены. Буфер данных должен остаться действительным, пока операция не была выполнена. setValue() устанавливает текущее положение чтения-записи в пункт после конца данных. Можно установить data = null (0), чтобы создать значение NULL.

    Сигнатура.

    int setValue
    (
      const void* data,
      Uint32 bytes
    )
    

    Параметры.

    • data, это должно вставляться или использоваться, чтобы переписать значение.

    • bytes длина data.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.21. NdbBlob::State

    Резюме

    Это перечисляемый тип данных, который представляет возможные статусы NdbBlob.

    Описание. NdbBlob может принять любой из этих статусов.

    Возможные значения.

    Таблица 2.34.

    Имя Описание
    Idle NdbBlob еще не был подготовлен к использованию ни с какими операциями.
    Prepared Это состояние NdbBlob до операционного выполнения.
    Active Это состояние обработчика BLOB после выполнения или установки следующего результата, но прежде, чем транзакция передается.
    Closed Это состояние происходит после того, как транзакция была передана.
    Invalid Это следует за отменой или завершением транзакции.

    2.3.18.22. NdbBlob::truncate()

    Описание. Этот метод используется, чтобы усечь blob к данной длине.

    Сигнатура.

    int truncate
    (
      Uint64 length = 0
    )
    

    Параметры. truncate() берет единственный параметр, который определяет новую длину length, к которой blob должна быть усечена. Этот метод не имеет никакого эффекта, если length больше, чем текущая длина (которую можно проверить использованием getLength()).

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.18.23. NdbBlob::writeData()

    Описание. Этот метод используется, чтобы написать данные NdbBlob. После успешного вызова положение чтения-записи будет на уровне первого байта после данных, которые были записаны.

    Запись после текущего конца данных расширяет blob автоматически.

    Сигнатура.

    int writeData
    (
      const void* data,
      Uint32 bytes
    )
    

    Параметры. Этот метод берет два параметра, указатель на данные data для записи и количество байт bytes в них.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.19. Класс NdbDictionary

    Резюме

    Этот класс обеспечивает метаинформацию об объектах базы данных, таких как таблицы, колонки и индексы.

    В то время как предпочтительный метод создания объекта базы данных и удаления через 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.

    2.3.19.1. NdbDictionary::getEmptyBitmask()

    Описание. Возвращает битовую маску присутствия пустого столбца, которая может использоваться с любым NdbRecord , чтобы определить, что нет столбцов NdbRecord , которые должны быть включены в операцию.

    Сигнатура.

    static const unsigned char* getEmptyBitmask
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Пустая битовая маска.

    2.3.19.2. NdbDictionary::getFirstAttrId()

    Описание. Получите первый признак ID, определенный объектом NdbRecord . Вернет false, если никакой признак ID не определяется.

    Сигнатура.

    static bool getFirstAttrId
    (
      const NdbRecord* record,
      Uint32& firstAttrId
    )
    

    Параметры. Указатель на NdbRecord и ссылка на признак (firstAttrID).

    Возвращаемое значение. Boolean false, когда никакой признак ID не может быть получен.

    2.3.19.3. NdbDictionary::getNextAttrId()

    Описание. Получите следующий признак ID, определенный объектом NdbRecord после переданного признака ID. Вернет false, когда больше нет признаков ID, которые будут возвращены.

    Сигнатура.

    static bool getNextAttrId
    (
      const NdbRecord* record,
      Uint32& attrId
    )
    

    Параметры. Указатель на NdbRecord и ссылка на ID признака.

    Возвращаемое значение. Boolean false, когда никакой признак ID не может быть получен.

    2.3.19.4. NdbDictionary::getNullBitOffset()

    Описание. Получить смещение бита null данного атрибута ID от начала строки NdbRecord. Вернет false, если признак ID не присутствует.

    Сигнатура.

    static bool getNullBitOffset
    (
      const NdbRecord* record,
      Uint32 attrId,
      Uint32& bytes,
      Uint32& bit
    )
    

    Параметры. NdbRecord record, в которой можно получить смещение данного признака ID (attrId). Смещение выражается как число байт (bytes) плюс число бит в последнем байте (bit).

    Возвращаемое значение. Boolean false, если признак с данным ID не присутствует.

    2.3.19.5. NdbDictionary::getOffset()

    Описание. Получить смещение данного атрибута ID от начала строки NdbRecord. Вернет false, если признак ID не присутствует.

    Сигнатура.

    static bool getOffset
    (
      const NdbRecord* record,
      Uint32 attrId,
      Uint32& offset
    )
    

    Параметры. Смещение offset данного признака ID с начала строки NdbRecord .

    Возвращаемое значение. Boolean false, если признак ID не присутствует.

    2.3.19.6. NdbDictionary::getRecordIndexName()

    Описание. Получите название объекта Index, на который ссылается NdbRecord .

    Если объект NdbRecord не IndexAccess NdbRecord , метод возвращает пустой указатель.

    Сигнатура.

    static const char* getRecordIndexName
    (
      const NdbRecord* record
    )
    

    Параметры. Указатель на NdbRecord для которого надо получить имя.

    Возвращаемое значение. Имя, если есть. Иначе или если объект NdbRecord не типа IndexAccess, этот метод вернет пустой указатель.

    2.3.19.7. NdbDictionary::getRecordRowLength()

    Описание. Получить число байтов, чтобы сохранить одну строку данных, как описано структурой NdbRecord, переданной этому методу.

    Сигнатура.

    static Uint32 getRecordRowLength
    (
      const NdbRecord* record
    )
    

    Параметры. Объект NdbRecord.

    Возвращаемое значение. Число байтов на строку.

    2.3.19.8. NdbDictionary::getRecordTableName()

    Описание. Возвратит название объекта таблицы, на который ссылается NdbRecord. Этот метод возвращает пустой указатель, если запись не TableAccess.

    Сигнатура.

    static const char* getRecordTableName
    (
      const NdbRecord* record
    )
    

    Параметры. record (объект NdbRecord ), для которого надо получить имя таблицы.

    Возвращаемое значение. Название таблицы или пустой указатель, если тип объекта NdbRecord не TableAccess.

    2.3.19.9. NdbDictionary::getRecordType()

    Описание. Возвратит тип объекта NdbRecord .

    Сигнатура.

    static RecordType getRecordType
    (
      const NdbRecord* record
    )
    

    Параметры. Объект NdbRecord.

    Возвращаемое значение. RecordType NdbRecord (IndexAccess или TableAccess).

    2.3.19.10. NdbDictionary::getValuePtr()

    Описание. Возвращает указатель на начало данных, определенных признаком ID, ища смещение колонки, сохраненной в объекте NdbRecord и возвращая сумму положения строки и смещения.

    Этот метод обеспечивает версии row-const и не-row-const.

    Сигнатура.

    static const char* getValuePtr
    (
      const NdbRecord* record,
      const char* row,
      Uint32 attrId
    )
    
    static char* getValuePtr
    (
      const NdbRecord* record,
      char* row,
      Uint32 attrId
    )
    

    Параметры. Указатель на объект NdbRecord , описывающий формат строки, указатель на начало данных строки (const в const-версии) и признак ID колонки.

    Возвращаемое значение. Указатель на начало признака в строке. Это null, если признак не часть определения NdbRecord.

    2.3.19.11. NdbDictionary::isNull()

    Описание. Установлен ли бит null для данной колонки в true or false. Местоположение пустого бита относительно указателя строки получено из переданного объекта NdbRecord. Если столбец не может быть null или он не часть определения NdbRecord, метод вернет false.

    Сигнатура.

    static bool isNull
    (
      const NdbRecord* record,
      const char* row,
      Uint32 attrId
    )
    

    Параметры. Указатель на объект NdbRecord, описывающий формат строки, указатель на начало данных строки и признак ID колонки, чтобы проверить.

    Возвращаемое значение. Boolean true, если признак ID существует в этом NdbRecord, он может быть null и пустой бит этой строки установлен, иначе Boolean false.

    2.3.19.12. NdbDictionary::setNull()

    Описание. Установите бит null для данной колонки к поставляемому значению. Смещение бита получено из переданного объекта NdbRecord . Если признак ID не является частью NdbRecord или если это не может быть null, этот метод возвращает ошибку (-1).

    Сигнатура.

    static int setNull
    (
      const NdbRecord* record,
      char* row,
      Uint32 attrId,
      bool value
    )
    

    Параметры. Указатель на record (объект NdbRecord) с описанием формата строки, указатель на начало данных строки row, признак ID колонки (attrId) и value, чтобы установить бит null (true или false).

    Возвращаемое значение. 0 при успехе, -1 если attrId не часть record или не может быть null.

    2.3.20. Структура NdbError

    Резюме

    структуру

    Эта секция обсуждает структуру NdbError, которая содержит статус и другую информацию об ошибках, включая коды ошибок, классификации и сообщения.

    Описание. NdbError состоит из шести частей, перечисленных здесь, которые устарели:

    1. Error status: Это описывает воздействие ошибки на приложении и отражает то, что должно сделать приложение, когда с ошибкой сталкивается.

      Ошибочный статус описан значением типа Status. См. раздел 2.3.20.2.

    2. Error classification: Это представляет логический ошибочный тип или группировку.

      Классификация ошибок описана значением типа Classification. См. раздел 2.3.20.1 для возможных классификаций и их интерпретации. Дополнительная информация предоставляется в разделе 2.4.4.

    3. Error code: Это внутренний код ошибки API NDB, который однозначно определяет ошибку.

      Не рекомендуется писать прикладные программы, которые зависят от определенных кодов ошибок. Вместо этого они должны проверить ошибочный статус и классификацию. Больше информации об ошибках может также быть получено, проверив сообщения об ошибках и (когда доступно) сообщения деталей ошибки. Однако, как коды ошибок, эти сообщения об ошибках и сообщения деталей ошибки подвержены изменениям.

      Список текущих кодов ошибок, представлен в разделе 2.4.2. Этот листинг обновляется с новыми выпусками кластера NDB. Можно также проверить файл storage/ndb/src/ndbapi/ndberror.c в исходных текстах NDB Cluster.

    4. MySQL Error code: Это соответствующий код ошибки MySQL Server. Коды ошибок MySQL не обсуждены в этом документе, пожалуйста, см. Server Error Message Reference в MySQL Manual.

    5. Error message: Это универсальное, независимое от контекста описание ошибки.

    6. 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.3.20.1. NdbError::Classification

    Описание. Этот тип описывает тип ошибки или логическую группу, которой это принадлежит.

    Возможные значения.

    Таблица 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.3.20.2. NdbError::Status

    Описание. Этот тип используется, чтобы описать статус ошибки.

    Возможные значения.

    Таблица 2.37.

    Имя Описание
    Success Никакая ошибка не произошла
    TemporaryError Временная и обычно исправимая ошибка, приложение должно повторить операцию, дающую начало ошибке
    PermanentError Систематическая ошибка, не восстанавливаемая
    UnknownResult Результат или статус операции неизвестны

    Соответствующая информация, определенная для определенного состояния ошибки, может быть найдена в разделе 2.4.4.

    2.3.21. Класс NdbEventOperation

    Резюме

    Эта секция описывает класс NdbEventOperation, который используется, чтобы наблюдать изменения (события) в базе данных. Это обеспечивает базовую функциональность, которая ранее была в NDB Cluster Replication.

    Родительский класс. Нет.

    Дочерние классы. Нет.

    Описание. NdbEventOperation представляет событие базы данных.

    Создание экземпляра NdbEventOperation. У этого класса нет публичного конструктора или деструтора. Вместо этого экземпляры NdbEventOperation создаются как результат вызовов метода на объектах Ndb и NdbDictionary , согласно следующим условиям:

    1. Должно существовать событие, которое было создано, используя Dictionary::createEvent(). Этот метод возвращает экземпляр класса Event.

    2. Объект 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() еще раз.

      См. разделы 2.3.16.27 и 2.3.16.25.

    • Код события не проверяет версию схемы таблицы. Когда таблица удалена, удостоверьтесь, что вы пропускаете любые связанные события.

    • Если вы получили полную эпоху, события с этой эпохи не перепосланы даже в случае неудачи узла. Однако, если неудача узла произошла, последующие эпохи могут содержать двойные события, которые могут быть определены по дубликатам первичного ключа.

      В коде 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.

    2.3.21.1. NdbEventOperation::clearError()

    Описание. Очищает ошибку, последний раз связанную с этой операцией событий.

    Устарело в NDB 7.4.3.

    Сигнатура.

    void clearError
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Нет.

    2.3.21.2. NdbEventOperation::execute()

    Описание. Активирует 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 при неудаче.

    2.3.21.3. NdbEventOperation::getBlobHandle()

    Описание. Этот метод используется вместо getValue() для blob. Обработчик blob (NdbBlob), возвращенный этим методом поддерживает только операции чтения.

    Чтобы получить предыдущее значение для признака blob, надо использовать getPreBlobHandle().

    Сигнатура.

    NdbBlob* getBlobHandle
    (
      const char* name
    )
    

    Параметры. Имя name атрибута blob.

    Возвращаемое значение. Указатель на объект NdbBlob.

    2.3.21.4. NdbEventOperation::getEpoch()

    Описание. Получает эпоху для полученных данных последнего события.

    Добавлено в NDB 7.4.3, этот метод заменяет getGCI(), который теперь устарел.

    Сигнатура.

    Uint64 getEpoch
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Номер эпохи (integer).

    2.3.21.5. NdbEventOperation::getEventType()

    Описание. Этот метод используется, чтобы получить тип события ( TableEvent).

    Устарело в NDB 7.4.3. В NDB 7.4.3 и позже необходимо использовать вместо этого getEventType2().

    Сигнатура.

    NdbDictionary::Event::TableEvent getEventType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. TableEvent.

    2.3.21.6. NdbEventOperation::getEventType2()

    Описание. Этот метод используется, чтобы получить тип события ( TableEvent).

    Добавлено в NDB 7.4.3, этот метод заменяет устаревший getEventType().

    Сигнатура.

    NdbDictionary::Event::TableEvent getEventType2
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. TableEvent.

    2.3.21.7. NdbEventOperation::getGCI()

    Описание. Этот метод восстанавливает GCI для последнего события.

    Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать getEpoch().

    Сигнатура.

    Uint64 getGCI
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Глобальный индекс контрольной точки последнего полученного события (integer).

    2.3.21.8. NdbEventOperation::getLatestGCI()

    Описание. Этот метод получает новый GCI.

    Этот метод возвращает последнее число эпохи.

    Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать Ndb::getHighestQueuedEpoch().

    Полученное с использованием этого метода GCI не обязательно связано с событием.

    Сигнатура.

    Uint64 getLatestGCI
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Индекс последней глобальной контрольной точки, integer.

    2.3.21.9. NdbEventOperation::getNdbError()

    Описание. Этот метод получает новую ошибку.

    Сигнатура.

    const struct NdbError& getNdbError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Ссылка на структуру NdbError.

    2.3.21.10. NdbEventOperation::getPreBlobHandle()

    Описание. Эта функция совпадает с getBlobHandle() за исключением того, что это используется, чтобы получить доступ к предыдущему значению признака blob. См. раздел 2.3.21.3 .

    Сигнатура.

    NdbBlob* getPreBlobHandle
    (
      const char* name
    )
    

    Параметры. Имя name для атрибута blob.

    Возвращаемое значение. Указатель на NdbBlob.

    2.3.21.11. NdbEventOperation::getPreValue()

    Описание. Этот метод выступает тождественно к getValue() за исключением того, что это используется, чтобы определить поисковую операцию предыдущего значения признака, а не текущего. Посмотрите раздел 2.3.21.13.

    Сигнатура.

    NdbRecAttr* getPreValue
    (
      const char* name,
      char* value = 0
    )
    

    Параметры. Этот метод берет эти два параметра, перечисленные здесь:

    • Имя name из признака (как постоянный указатель на символ).

    • Указатель на value таким образом, что:

      • Если значение атрибута не NULL, значение атрибута возвращено в этом параметре.

      • Если значение атрибута NULL, значение атрибута сохранено только в объекте NdbRecAttr , который возвращен этим методом.

      См. value Buffer Memory Allocation.

    Возвращаемое значение. Объект NdbRecAttr , чтобы хранить значение признака или NULL, указывающий, что ошибка произошла.

    2.3.21.12. NdbEventOperation::getState()

    Описание. Этот метод получает текущее состояние операции событий.

    Сигнатура.

    State getState
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Значение State. См. раздел 2.3.21.20.

    2.3.21.13. NdbEventOperation::getValue()

    Описание. Этот метод определяет поиск значения атрибута. 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 указывающий, что ошибка произошла.

    2.3.21.14. NdbEventOperation::hasError()

    Описание. Этот метод используется, чтобы определить, есть ли ошибка, связанная с этой операцией событий.

    Устарело в NDB 7.4.3, в NDB 7.4.3 и позже, необходимо вместо этого использовать getEventType2(), чтобы определить тип события. Посмотрите раздел 2.3.6.23.

    Сигнатура.

    int hasError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Если потеря событий произошла, то этот метод возвращает 0, иначе 1.

    2.3.21.15. NdbEventOperation::isConsistent()

    Описание. Этот метод используется, чтобы определить, произошла ли потеря событий после сбоя узла.

    Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого использовать getEventType2(), чтобы определить, имеет ли событие тип TE_INCONSISTENT. См. раздел 2.3.6.23.

    Сигнатура.

    bool isConsistent
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Если потеря событий произошла, то этот метод возвращает false, иначе true.

    2.3.21.16. NdbEventOperation::isEmptyEpoch()

    Описание. Этот метод используется, чтобы определить, отмечают ли потребляемые данные о событии пустую эпоху.

    Добавлено в NDB 7.4.3.

    Сигнатура.

    bool isEmptyEpoch
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Если эта эпоха пуста, вернет true, иначе false.

    2.3.21.17. NdbEventOperation::isErrorEpoch()

    Описание. Этот метод используется, чтобы определить, отмечают ли потребляемые данные о событии пустую эпоху.

    Добавлено в NDB 7.4.3.

    Сигнатура.

    bool isErrorEpoch
    (
      NdbDictionary::Event::TableEvent* error_type = 0
    )
    

    Параметры. Если это ошибочная эпоха, error_type содержит значение TableEvent, соответствующее ошибке.

    Возвращаемое значение. Если эта эпоха ошибочна, вернет true, иначе false.

    2.3.21.18. NdbEventOperation::isOverrun()

    Описание. Этот метод используется, чтобы определить, произошла ли потеря событий из-за переполнения буфера.

    Сигнатура.

    bool isOverrun
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Если буфер событий был переполнен, то этот метод возвращает true, иначе false.

    2.3.21.19. NdbEventOperation::mergeEvents()

    Описание. Этот метод используется, чтобы установить флаг слияния событий. Для получения информации о слиянии событий посмотрите раздел 2.3.6.18.

    Флаг слияния событий по умолчанию false.

    Сигнатура.

    void mergeEvents
    (
      bool flag
    )
    

    Параметры. A Boolean flag.

    Возвращаемое значение. Нет.

    2.3.21.20. NdbEventOperation::State

    Описание. Этот тип описывает состояние операции событий.

    Возможные значения.

    Таблица 2.39.

    Имя Описание
    EO_CREATED Операция событий была создана, но execute() еще не был вызван.
    EO_EXECUTING Метод execute() был вызван для этой операции событий.
    EO_DROPPED Операция событий ждет, чтобы быть удаленной и больше не применима.
    EO_ERROR Ошибка произошла, операция событий непригодна.

    Значение State возвращено методом getState().

    2.3.21.21. NdbEventOperation::tableFragmentationChanged()

    Описание. Этот метод используется, чтобы проверить, изменилась ли фрагментация таблицы в связи с событием TE_ALTER . См. раздел 2.3.6.23.

    Сигнатура.

    bool tableFragmentationChanged
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Вернет true, если фрагментация таблицы изменилась, иначе false.

    2.3.21.22. NdbEventOperation::tableFrmChanged()

    Описание. Используйте этот метод, чтобы определить, изменился ли у таблицы файл .FRM в связи с событием TE_ALTER, см. раздел 2.3.6.23.

    Сигнатура.

    bool tableFrmChanged
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если файл .FRM изменен, иначе method returns false.

    2.3.21.23. NdbEventOperation::tableNameChanged()

    Описание. Этот метод проверяет, изменилось ли имя таблицы как результат события TE_ALTER, см раздел 2.3.6.23.

    Сигнатура.

    bool tableNameChanged
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если название таблицы изменилось, иначе false.

    2.3.21.24. NdbEventOperation::tableRangeListChanged()

    Описание. Используйте этот метод, чтобы проверить, изменилось ли название списка разделения диапазона таблицы в связи с событием TE_ALTER.

    Сигнатура.

    bool tableRangeListChanged
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если имя раздела диапазона или списка изменилось, иначе false.

    2.3.22. Класс NdbIndexOperation

    Резюме

    Эта секция описывает класс NdbIndexOperation и его публичные методы.

    Родительский класс. NdbOperation.

    Дочерние классы. Нет.

    Описание. NdbIndexOperation представляет операцию по индексу для использования в транзакциях. Этот класс наследует NdbOperation.

    NdbIndexOperation может использоваться только с уникальными хэш-индексами, чтобы работать с упорядоченными индексами, надо использовать NdbIndexScanOperation.

    У этого класса нет публичного конструктора. Создать экземпляр NdbIndexOperation можно с использованием метода NdbTransaction::getNdbIndexOperation().

    Методы.

    Таблица 2.40.

    Имя Описание
    deleteTuple() Удаляет кортеж из таблицы
    getIndex() Получает индекс, использованный операцией
    readTuple() Читает кортеж от таблицы
    updateTuple() Обновляет существующий кортеж в таблице

    Операциям по индексу не разрешают вставить кортежи.

    Типы. Класс NdbIndexOperation не определяет собственных публичных типов.

    См. раздел 1.3.2.3.2 .

    2.3.22.1. NdbIndexOperation::deleteTuple()

    Описание. Этот метод определяет NdbIndexOperation как операцию DELETE. Когда метод NdbTransaction::execute() вызван, операция удаляет кортеж из таблицы.

    Сигнатура.

    int deleteTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.22.2. NdbIndexOperation::getIndex()

    Описание. Получает индекс, учитывая операцию по индексу.

    Сигнатура.

    const NdbDictionary::Index* getIndex
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на объект Index.

    2.3.22.3. NdbIndexOperation::readTuple()

    Описание. Этот метод определяет NdbIndexOperation как операцию READ. Когда метод NdbTransaction::execute() вызван, операция читает кортеж.

    Сигнатура.

    int readTuple
    (
      LockMode mode
    )
    

    Параметры. mode определяет режим блокировки, используемый операцией чтения. Посмотрите раздел 2.3.25.15.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.22.4. NdbIndexOperation::updateTuple()

    Описание. Этот метод определяет NdbIndexOperation как операцию UPDATE. При вызове метода NdbTransaction::execute() операция обновляет кортеж, найденный в таблице.

    Сигнатура.

    int updateTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.23. Класс NdbIndexScanOperation

    Резюме

    Эта секция обсуждает класс 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.

    2.3.23.1. NdbIndexScanOperation::BoundType

    Описание. Этот тип используется, чтобы описать связанный ключ.

    Числовые значения фиксируются в API и могут использоваться явно, другими словами, допустимо вычислить значения и использовать их.

    Возможные значения.

    Таблица 2.42.

    Значение Числовое значение Описание
    BoundLE 0 Нижняя граница
    BoundLT 1 Строгая нижняя граница
    BoundGE 2 Верхняя граница
    BoundGT 3 Строгая верхняя граница
    BoundEQ 4 Равенство

    2.3.23.2. NdbIndexScanOperation::end_of_bound()

    Описание. Этот метод используется, чтобы отметить конец привязки, это используется, когда читается пакет индекса (то есть, используя многократные диапазоны).

    Сигнатура.

    int end_of_bound
    (
      Uint32 range_no
    )
    

    Параметры. Номер диапазона, на котором происходит привязка.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.23.3. NdbIndexScanOperation::getDescending()

    Описание. Этот метод используется, чтобы проверить, спускается ли просмотр.

    Сигнатура.

    bool getDescending
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если просмотр сортирован в порядке убывания, иначе false.

    2.3.23.4. NdbIndexScanOperation::get_range_no()

    Описание. Этот метод возвращает номер диапазона для текущей строки.

    Сигнатура.

    int get_range_no
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Номер диапазона (integer).

    2.3.23.5. NdbIndexScanOperation::getSorted()

    Описание. Этот метод используется, чтобы проверить, сортирован ли просмотр.

    Сигнатура.

    bool getSorted
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если просмотр сортирован, иначе false.

    2.3.23.6. NdbIndexScanOperation::readTuples()

    Описание. Этот метод используется, чтобы прочитать кортежи, используя упорядоченный индекс.

    Сигнатура.

    virtual int readTuples
    (
      LockMode mode = LM_Read,
      Uint32 flags = 0,
      Uint32 parallel = 0,
      Uint32 batch = 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 при ошибке.

    2.3.23.7. NdbIndexScanOperation::reset_bounds()

    Описание. Перезагружает границы и помещает операцию в список, который пошлют при следующем вызове NdbTransaction::execute().

    Сигнатура.

    int reset_bounds
    (
      bool forceSend = false
    )
    

    Параметры. Установите forceSend = true, чтобы вынудить операцию быть посланной немедленно.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.23.8. NdbIndexScanOperation::setBound()

    Описание. Этот метод определяет привязанный ключ индекса, используемый в просмотре диапазона, и устанавливает границы для просмотров индекса, определенных, используя 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,
      int type,
      const void* value
    )
    

    Второй способ вызвать этот метод в старом API использует ID границ, а не имя, как показано здесь:

    int setBound
    (
      Uint32 id,
      int type,
      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,
      Uint32 sizeOfPartInfo = 0
    )
    

    Параметры (определяя разделение).

    • keyRecord: Это структура NdbRecord , соответствующая ключу, который определяет индекс.

    • bound добавляемый к просмотру (см. раздел 2.3.12).

    • partInfo: Это указатель на PartitionSpec, который предоставляет дополнительную информацию, позволяющую просмотреть уменьшенный набор разделения.

    • sizeOfPartInfo: Длина спецификации разделения.

    keyRecord и bound определяются и используются таким же образом, как с версией с 2 параметрами этого метода.

    Возвращаемое значение. Returns 0 при успехе, -1 при неудаче.

    2.3.24. Класс NdbInterpretedCode

    Резюме

    Эта секция обсуждает класс 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.

    Типы. Этот класс не определяет публичных типов.

    2.3.24.1. Применение NdbInterpretedCode

    Следующие несколько секций предоставляют информацию о выполнении различных типов операций с методами NdbInterpretedCode, включая использование ресурсов.

    2.3.24.1.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

    2.3.24.1.2. Методы NdbInterpretedCode для копирования значений между регистрами и столбцами таблицы

    NdbInterpretedCode предоставляет два метода для копирования значений между колонкой в текущей строке таблицы и регистром программы. read_attr() используется, чтобы скопировать значение столбца таблицы в регистр программы, write_attr() используется, чтобы скопировать значение регистра программы в столбец таблицы. Оба этих метода требуют, чтобы таблица была определен, создавая объект NdbInterpretedCode, для которого их вызывают.

    Пространство, требуемое каждым из этих методов, показывают в следующей таблице:

    Таблица 2.45.

    Метод Буфер (слова) Сообщение запроса (слова)
    read_attr()1 1
    write_attr()1 1

    См. разделы 2.3.24.43 и 2.3.24.47.

    2.3.24.1.3. Методы арифметики регистров NdbInterpretedCode

    NdbInterpretedCode предоставляет два метода для выполнения арифметических операций в регистрах. Используя add_reg(), можно загрузить сумму двух регистров в другой регистр, sub_reg() позволяет загрузить разность двух регистров в другой регистр.

    Пространство, требуемое каждым из этих методов, показывают в следующей таблице:

    Таблица 2.46.

    Метод Буфер (слова) Сообщение запроса (слова)
    add_reg()1 1
    sub_reg()1 1

    См. разделы 2.3.24.3 и 2.3.24.45.

    2.3.24.1.4. NdbInterpretedCode: этикетки и переходы

    Класс 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.

    2.3.24.1.5. Основанные на регистре операции ветвления NdbInterpretedCode

    Большинство из них используется, чтобы ветвиться на основе результатов сравнений регистров. Есть также два метода, используемые, чтобы сравнить значение регистра с NULL. Все эти методы требуют в качестве параметра, чтобы этикетка была определена методом def_label().

    Эти методы могут считаться выполнением следующей логики:

    if (register_value1 condition register_value2)
    goto Label
    

    Пространство, требуемое каждым из этих методов, показывают в следующей таблице:

    Таблица 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

    2.3.24.1.6. Основанные на колонке операции ветвления NdbInterpretedCode

    Методы, описанные в этой секции, используются, чтобы выполнить переход на основе сравнения между значением столбца таблицы и данной постоянной величиной. Каждый из этих методов ожидает признак ID колонки, значение которой должно быть проверено, а не ссылку на объект Column.

    Эти методы, за исключением branch_col_eq_null() и branch_col_ne_null(), могут считаться выполнением следующей логики:

    if (constant_value condition column_value)
    goto Label
    

    В каждом случае (еще раз за исключением 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( L / 8)
    branch_col_ne()2 2 + CEIL( L / 8)
    branch_col_lt()2 2 + CEIL( L / 8)
    branch_col_le()2 2 + CEIL( L / 8)
    branch_col_gt()2 2 + CEIL( L / 8)
    branch_col_ge()2 2 + CEIL( L / 8)

    Выражение CEIL( L /8) это количество целых 8-байтовых слов, требуемых, чтобы хранить постоянную величину, которая будет сравнена.

    2.3.24.1.7. Основанные на образце операции ветвления NdbInterpretedCode

    Класс 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] LIKE pattern)
    goto Label;
    

    Требования к месту для этих методов показывают в следующей таблице, где L представляет длину постоянной величины:

    Таблица 2.49.

    Метод Буфер (слова) Сообщение запроса (слова)
    branch_col_like()2 2 + CEIL( L / 8)
    branch_col_notlike()2 2 + CEIL( L /8)

    CEIL( L /8) это количество целых 8-байтовых слов, требуемых, чтобы хранить постоянную величину, которая будет сравнена.

    2.3.24.1.8. Операции битового сравнения NdbInterpretedCode

    Эти инструкции используются, чтобы ветвиться на основе результата логического сравнения AND между значением столбца BIT и образцом битовой маски.

    Использование этих методов требует, чтобы таблица поставлялась когда объект NdbInterpretedCode создан. Значение маски должно быть того же самого размера, как сравниваемый столбец. BIT передаются в и из API NDB как 32-битные слова с битами, приведенными в порядок от младшего значащего бита до старшего значащего бита. На x86 это первый байт (байт 0), на SPARC и PPC, это последний байт.

    Длина буфера и продолжительность запроса для каждого из методов, перечисленных здесь, требует суммы пространства, равного 2 словам плюс ширина столбца, округленная к самому близкому целому слову:

    2.3.24.1.9. Методы обработки результата NdbInterpretedCode

    Методы, описанные в этой секции, используются, чтобы сказать транслятору, что обработка текущей строки завершена и (в случае просмотров) включать ли эту строку в результаты просмотра.

    Требования к месту для этих методов показывают в следующей таблице, где L представляет длину постоянной величины:

    Таблица 2.50.

    Метод Буфер (слова) Сообщение запроса (слова)
    interpret_exit_ok()1 1
    interpret_exit_nok()1 1
    interpret_exit_last_row()1 1

    2.3.24.1.10. Удобные методы NdbInterpretedCode

    Методы, описанные в этой секции, могут использоваться, чтобы вставить многоадресные команды (использующие определенные регистры) в интерпретируемую программу.

    В дополнение к обновлению столбца таблицы эти методы используют списки регистров 6 и 7, заменяя любое существующее содержание регистра 6 значениею первоначального столбца и любое существующее содержание регистра 7 измененным значением столбца. Сама таблица должна быть ранее определена, создавая объект NdbInterpretedCode, для которого вызван метод.

    Требования к месту для этих методов показывают в следующей таблице, где L представляет длину постоянной величины:

    Таблица 2.51.

    Метод Буфер (слова) Сообщение запроса (слова)
    add_val()4 1, если поставляемое значение >= 216: 2, если >= 232: 3
    sub_val()4 1, если поставляемое значение >= 216: 2, если >= 232: 3

    2.3.24.1.11. Используя подпрограммы с NdbInterpretedCode

    NdbInterpretedCode допускает подпрограммы, которые могут быть вызваны из интерпретируемых программ с каждой подпрограммой, определяемой уникальным числом. Подпрограммы могут быть определены, только следуя всем главным инструкциям по программе.

    Числа определяют, что подпрограммы должны быть смежными, однако, они не должны быть ни в каком конкретном порядке.

    • Начало подпрограммы обозначается, вызывая метод def_sub().

    • ret_sub() заканчивает подпрограмму, все инструкции после def_sub() принадлежат подпрограмме, пока она не будет закончена, используя этот метод.

    • Подпрограмму вызывают, используя метод call_sub().

    Как только подпрограмма закончится, выполнение программы продолжится с инструкции немедленно после той, которая вызвала подпрограмму. Подпрограммы могут также быть вызваны от других подпрограмм, в настоящее время максимальная глубина стека подпрограмм равняется 32.

    2.3.24.1.12. Служебные методы NdbInterpretedCode

    Некоторые дополнительные служебные методы, поставляемые NdbInterpretedCode:

    • copy(): Копирует существующую интерпретируемую программу, выполняя глубокую копию на связанном объекте NdbInterpretedCode.

    • finalise(): Готовит интерпретируемую программу, решая все команды ветвления и вызовы подпрограммы.

    • getTable(): Получает ссылку на таблицу, для которой был определен объект NdbInterpretedCode.

    • getNdbError(): Связывает новую ошибку с этим объектом NdbInterpretedCode.

    • getWordsUsed(): Получает количество слов, используемых из буфера.

    2.3.24.2. Конструктор NdbInterpretedCode

    Описание. Это конструктор класса NdbInterpretedCode.

    Сигнатура.

    NdbInterpretedCode
    (
      const NdbDictionary::Table* table = 0,
      Uint32* buffer = 0,
      Uint32 buffer_word_size = 0
    )
    

    Альтернативный конструктор (NDB 8.0.18 и позже).

    NdbInterpretedCode
    (
      const NdbRecord&,
      Uint32* buffer = 0,
      Uint32 buffer_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.

    2.3.24.3. NdbInterpretedCode::add_reg()

    Описание. Этот метод суммирует значения, сохраненные в любых двух данных регистрах, и хранит результат в третьем регистре.

    Сигнатура.

    int add_reg
    (
      Uint32 RegDest,
      Uint32 RegSource1,
      Uint32 RegSource2
    )
    

    Параметры. Этот метод берет три параметра. Первым из них является регистр, в котором должен быть сохранен результат (RegDest). Второй и третий параметры (RegSource1 и RegSource2) это регистры, значения которых должны быть суммированы.

    Возможно повторное использоване для хранения результата одного из регистров, значения которых суммированы, то есть, RegDest может быть RegSource1 или RegSource2.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.4. NdbInterpretedCode::add_val()

    Описание. Этот метод добавляет указанное значение к значению данного столбца таблицы и помещает оригинальное и измененное значения столбцов в регистры 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
    (
      Uint32 attrId,
      Uint32 aValue
    )
    

    64-bit aValue:

    int add_val
    (
      Uint32 attrId,
      Uint64 aValue
    )
    

    Параметры. ID признака столбца таблицы и 32-битное или 64-битное integer, которое будет добавлено к этому значению столбца.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.5. NdbInterpretedCode::branch_col_and_mask_eq_mask()

    Описание. Этот метод используется, чтобы сравнить значение столбца BIT с битовой маской, если значение столбца AND с битовой маской равно битовой маске, выполнение передается на указанную этикетку, определенную в вызове метода.

    Сигнатура.

    int branch_col_and_mask_eq_mask
    (
      const void* mask,
      Uint32 unused,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Указатель на константу mask, которой надо сравнить значение столбца.

    • Uint32, которое в настоящее время не используется.

    • attrId колонки, которая будет сравнена.

    • Программная этикетка Label для перехода, если условие верно.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.6. NdbInterpretedCode::branch_col_and_mask_eq_zero()

    Описание. Этот метод используется, чтобы сравнить столбец BIT с битовой маской, если значение столбца AND с битовой маской равно 0, тогда выполнение переходит к указанной этикетке, определенной в вызове метода.

    Сигнатура.

    int branch_col_and_mask_eq_zero
    (
      const void* mask,
      Uint32 unused,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Указатель на константу mask, с которой сравнить значение столбца.

    • Uint32 в настоящее время не используется.

    • attrId колонки, которая будет сравнена.

    • Этикетка Label для перехода, если условие верно.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.7. NdbInterpretedCode::branch_col_and_mask_ne_mask()

    Описание. Этот метод используется, чтобы сравнить столбец BIT с битовой маской, AND с битовой маской не равно битовой маске, выполнение передается на указанную этикетку, определенную в вызове метода.

    Сигнатура.

    int branch_col_and_mask_ne_mask
    (
      const void* mask,
      Uint32 unused,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Указатель на константу mask, с которой надо сравнить.

    • Uint32 пока не используется.

    • attrId колонки, которая будет сравнена.

    • Этикетка Label на которую передать выполнение, если условие верно.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.8. NdbInterpretedCode::branch_col_and_mask_ne_zero()

    Описание. Этот метод используется, чтобы сравнить значение BIT с битовой маской, если значение столбца AND с битовой маской не равно 0, выполнение переходит к указанной этикетке, определенной в вызове метода.

    Сигнатура.

    int branch_col_and_mask_ne_zero
    (
      const void* mask,
      Uint32 unused,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Указатель на константу mask, с которой надо сравнить.

    • Uint32 пока не используется.

    • attrId колонки, которая будет сравнена.

    • Этикетка Label на которую передать выполнение, если условие верно.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.9. NdbInterpretedCode::branch_col_eq()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если значения равны. В NDB 8.0.18 и позже, это может также использоваться, чтобы сравнить две колонки на равенство.

    Сигнатура. Сравните колонку со значением:

    int branch_col_eq
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Сравните две колонки:

    int branch_col_eq
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Сравнивая колонку и значение, этот метод берет следующие четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено с val.

    • Этикетка Label (ранее определенная использованием def_label()) для перехода, если значения равны.

    Сравнивая два значения столбца таблицы, требуемые параметры показывают здесь:

    • AttrId1: ID признака первого столбца таблицы, значение которого должно быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Местоположение, чтобы перейти, если сравненные колонки равны. Должно быть уже определено, используя def_label().

    Используя этот метод, чтобы сравнить две колонки, колонки должны иметь точно тот же самый тип.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.10. NdbInterpretedCode::branch_col_eq_null()

    Описание. Этот метод проверяет значение столбца таблицы и переходит на обозначенную этикетку программы, если значение столбца NULL.

    Сигнатура.

    int branch_col_eq_null
    (
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Признак ID столбца таблицы.

    • Этикетка программы для перехода, если значение столбца NULL.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.11. NdbInterpretedCode::branch_col_ge()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если значение столбца соответствует. В NDB 8.0.18 и позже это может также использоваться, чтобы сравнить две колонки и выполнить переход, если значение первой колонки больше или равно второй.

    Сигнатура. Сравните значение с колонкой:

    int branch_col_ge
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 label
    )
    

    Сравните значения двух столбцов:

    int branch_col_ge
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Когда используется сравнение значения с колонкой, этот метод берет эти четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено с val.

    • label (ранее определенная с использованием def_label()).

    Метод берет параметры, перечисленные здесь, когда используется, чтобы сравнить две колонки:

    • AttrId1: ID признака первого столбца таблицы, значение которого должно быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Этикетка для перехода.

    Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.12. NdbInterpretedCode::branch_col_gt()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа больше, чем значение столбца. В NDB 8.0.18 и позже этот метод перегружен таким образом, что это может использоваться, чтобы сравнить два значения столбцов и сделать переход, если первое больше, чем второе.

    Сигнатура. Сравните значение с колонкой:

    int branch_col_ge
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 label
    )
    

    Сравните значения двух столбцов:

    int branch_col_ge
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Когда используется, чтобы сравнить значение со столбцом таблицы, этот метод берет следующие четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено val.

    • Label (ранее определенная с использованием def_label()).

    Метод берет эти три параметра, перечисленные здесь, когда используется, чтобы сравнить две колонки:

    • AttrId1: ID признака первого столбца таблицы, значение которого должно быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Этикетка для перехода.

    Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.13. NdbInterpretedCode::branch_col_le()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа меньше или равна значению столбца. Начиная с NDB 8.0.18 это может также использоваться, чтобы сравнить два значения столбца таблицы этим способом.

    Сигнатура. Сравните значение столбца таблицы с константой:

    int branch_col_le
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Сравните значения двух столбцов таблицы:

    int branch_col_ge
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет эти четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено с val.

    • Label (ранее определенная с использованием def_label()).

    Метод берет эти три параметра, перечисленные здесь, когда используется, чтобы сравнить два значения столбца таблицы:

    • AttrId1: ID признака первого столбца таблицы, значение которого должна быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Этикетка для перехода.

    Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.14. NdbInterpretedCode::branch_col_like()

    Описание. Этот метод проверяет значение столбца таблицы на соответствие образцу регулярного выражения и переходит на обозначенную этикетку программы, если оно соответствует.

    Сигнатура.

    int branch_col_like
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Образец регулярного выражения (val), см. раздел 2.3.24.1.7 .

    • Длина образца (в байтах).

    • Признак ID для проверяемого столбца таблицы.

    • Этикетка программы, чтобы перейти.

    Возвращаемое значение. 0 при успехе, -1 при неудаче

    2.3.24.15. NdbInterpretedCode::branch_col_lt()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа меньше, чем значение столбца. В NDB 8.0.18 и позже два значения столбца таблицы могут быть сравнены вместо этого.

    Сигнатура. Сравните значение столбца таблицы с константой:

    int branch_col_lt
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Сравните два значения столбца таблицы:

    int branch_col_lt
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет следующие четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено с val.

    • Label (ранее определенная с использованием def_label()).

    Когда используется, чтобьы сравнить два значения столбца таблицы, branch_col_lt() берет следующие три параметра:

    • AttrId1: ID признака первого столбца таблицы, значение которого должно быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Этикетка для перехода.

    Сравнивая два значения столбца таблицы, типы значений столбца таблицы должны быть точно теми же самыми. Это означает, что у них должны быть та же самая длина, точность и масштаб.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.16. NdbInterpretedCode::branch_col_ne()

    Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если две значения не равны. В NDB 8.0.18 и позже это может также использоваться, чтобы сравнить значение столбца таблицы с другим значением столбца таблицы вместо этого.

    Сигнатура. Сравните значение столбца таблицы с константой:

    int branch_col_ne
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Сравните два значения столбца таблицы:

    int branch_col_ne
    (
      Uint32 attrId1,
      Uint32 attrId2,
      Uint32 label
    )
    

    Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет эти четыре параметра:

    • Постоянная величина (val).

    • Длина значения (в байтах).

    • ID признака столбца таблицы, значение которого должно быть сравнено с val.

    • Label (ранее определенная с использованием def_label()).

    Сравнивая два значения столбца таблицы, требуемые параметры показывают здесь:

    • AttrId1: ID признака первого столбца таблицы, значение которого должно быть сравнено.

    • AttrId2: Признак ID второго столбца таблицы.

    • label: Местоположение, чтобы перейти, если сравненные колонки разные. Должно быть уже определено, используя def_label().

    Используя этот метод, чтобы сравнить два значения столбца таблицы, колонки должны иметь точно тот же самый тип.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.17. NdbInterpretedCode::branch_col_ne_null()

    Описание. Этот метод проверяет значение столбца таблицы и переходит на обозначенную этикетку программы, если значение столбца не NULL.

    Сигнатура.

    int branch_col_ne_null
    (
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Признак ID столбца таблицы.

    • Этикетка для перехода.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.18. NdbInterpretedCode::branch_col_notlike()

    Описание. Этот метод подобен branch_col_like(), это проверяет значение столбца таблицы на соответствие образцу регулярного выражения, однако, это переходит на этикетку программы, только если образец и значение столбца разные.

    Сигнатура.

    int branch_col_notlike
    (
      const void* val,
      Uint32 len,
      Uint32 attrId,
      Uint32 Label
    )
    

    Параметры.

    • Образец регулярного выражения (val), см. раздел 2.3.24.1.7 .

    • Длина образца (в байтах).

    • Признак ID для проверяемого столбца таблицы.

    • Этикетка программы для перехода.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.19. NdbInterpretedCode::branch_eq()

    Описание. Этот метод сравнивает два значения регистра, если они равны, интерпретируемая программа переходит к указанной этикетке.

    Сигнатура.

    int branch_eq
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра, регистры, значения которых должны быть сравнены, это RegLvalue и RegRvalue, и этикетка Label для перехода. Она должна быть заранее задана через def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.20. NdbInterpretedCode::branch_eq_null()

    Описание. Этот метод сравнивает значение регистра с NULL, если значение регистра null, программа переходит на указанную этикетку.

    Сигнатура.

    int branch_eq_null
    (
      Uint32 RegLvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет два параметра: регистр, значение которого должно быть сравнено с NULL, (RegLvalue) и этикетка Label для перехода. Label должна быть определена def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.21. NdbInterpretedCode::branch_ge()

    Описание. Этот метод сравнивает два значения регистра, если первое больше или равно второму, программа переходит на этикетку.

    Сигнатура.

    int branch_ge
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра: регистры, значения которых должны быть сравнены (RegLvalue и RegRvalue) и этикетка Label для перехода. Label должна быть задана с def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.22. NdbInterpretedCode::branch_gt()

    Описание. Этот метод сравнивает два значения регистра, если первое больше, чем второе, программа переходит на этикетку.

    Сигнатура.

    int branch_gt
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра: регистры, значения которых должны быть сравнены (RegLvalue и RegRvalue) и метка Label для перехода. Label должна быть определена ранее, используя def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.23. NdbInterpretedCode::branch_label()

    Описание. Этот метод выполняет безусловный переход к этикетке программы (см. раздел 2.3.24.30).

    Сигнатура.

    int branch_label
    (
      Uint32 Label
    )
    

    Параметры. Этот метод берет единственный параметр, этикетку Label, определенную с использованием def_label().

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.24. NdbInterpretedCode::branch_le()

    Описание. Этот метод сравнивает два значения регистра, если первое меньше или равно второму, переходит на этикетку.

    Сигнатура.

    int branch_le
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра: регистры, значения которых должны быть сравнены (RegLvalue и RegRvalue) и этикетку Label для перехода. Label должна быть определена через def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.25. NdbInterpretedCode::branch_lt()

    Описание. Этот метод сравнивает два значения регистра, если первое меньше, чем второе, переходит на этикетку.

    Сигнатура.

    int branch_lt
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра: регистры, значения которых должны быть сравнены (RegLvalue и RegRvalue) и Label для перехода. Label должна быть задана через def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.26. NdbInterpretedCode::branch_ne()

    Описание. Этот метод сравнивает два значения регистра, если они не равны, то переходит на этикетку.

    Сигнатура.

    int branch_ne
    (
      Uint32 RegLvalue,
      Uint32 RegRvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет три параметра: регистры, значения которых должны быть сравнены (RegLvalue и RegRvalue) и этикетку Label, которая должна быть определена через def_label().

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.27. NdbInterpretedCode::branch_ne_null()

    Описание. Этот метод сравнивает значение регистра с NULL, если значение не null, переходит на этикетку.

    Сигнатура.

    int branch_ne_null
    (
      Uint32 RegLvalue,
      Uint32 Label
    )
    

    Параметры. Этот метод берет два параметра: регистр, значение которого должно быть сравнено с NULL (RegLvalue) и этикетку для перехода Label, определенную через def_label() (см. раздел 2.3.24.30).

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.28. NdbInterpretedCode::call_sub()

    Описание. Этот метод используется, чтобы вызвать подпрограмму.

    Сигнатура.

    int call_sub
    (
      Uint32 SubroutineNumber
    )
    

    Параметры. Этот метод берет единственный параметр, номер, определяющее подпрограмму, которую вызовут.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.29. NdbInterpretedCode::copy()

    Описание. Делает глубокую копию объекта NdbInterpretedCode.

    Сигнатура.

    int copy
    (
      const NdbInterpretedCode& src
    )
    

    Параметры. Ссылка на копию.

    Возвращаемое значение. 0 при успехе или код ошибки.

    2.3.24.30. NdbInterpretedCode::def_label()

    Описание. Этот метод определяет этикетку, которая будет использоваться в качестве цели одного или более переходов в программе.

    def_label() использует буфер с 2 словами и не требует никакого пространства для сообщений запроса.

    Сигнатура.

    int def_label
    (
      int LabelNum
    )
    

    Параметры. Этот метод берет единственный параметр LabelNum, чье значение должно быть уникально среди всех значений, используемых для этикеток в рамках интерпретируемой программы.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.31. NdbInterpretedCode::def_sub()

    Описание. Этот метод используется, чтобы отметить начало подпрограммы. Посмотрите раздел 2.3.24.1.11.

    Сигнатура.

    int def_sub
    (
      Uint32 SubroutineNumber
    )
    

    Параметры. Единственный параметр, номер определенной подпрограммы.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.32. NdbInterpretedCode::finalise()

    Описание. Этот метод готовит интерпретируемую программу, включая любые подпрограммы, решая все команды ветвления и обращения к подпрограммам. Это нужно вызвать перед использованием программы и можно вызвать только однажды для любого данного объекта NdbInterpretedCode.

    Если никакие инструкции не были определены, этот метод пытается вставить вызов метода interpret_exit_ok() до завершения.

    Сигнатура.

    int finalise
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.33. NdbInterpretedCode::getNdbError()

    Описание. Этот метод возвращает новую ошибку, связанную с этим объектом NdbInterpretedCode.

    Сигнатура.

    const class NdbError& getNdbError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Ссылка на объект NdbError .

    2.3.24.34. NdbInterpretedCode::getTable()

    Описание. Этот метод может использоваться, чтобы получить ссылку на таблицу, для который определен объект NdbInterpretedCode.

    Сигнатура.

    const NdbDictionary::Table* getTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на объект Table. NULL, если никакой объект таблицы не задан, при создании NdbInterpretedCode.

    2.3.24.35. NdbInterpretedCode::getWordsUsed()

    Описание. Этот метод возвращает количество слов от буфера, которые использовались, является ли буфер тем, который создан пользователями или внутренне обеспеченный буфер.

    Сигнатура.

    Uint32 getWordsUsed
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-битное количество слов в буфере.

    2.3.24.36. NdbInterpretedCode::interpret_exit_last_row()

    Описание. Для операции по просмотру вызов этого метода указывает, что эта строка должна быть возвращена как часть просмотра, и что больше строк в этом фрагменте не должно быть просмотрено. Для других типов операций метод заставляет операцию быть прерванной.

    Сигнатура.

    int interpret_exit_last_row
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.37. NdbInterpretedCode::interpret_exit_nok()

    Описание. Для операций просмотра этот метод используется, чтобы указать, что текущая строка не должна быть возвращена как часть просмотра, и программа должна идти дальше к следующей строке. Это заставляет другие типы операций быть прерванными.

    Сигнатура.

    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 при ошибке.

    2.3.24.38. NdbInterpretedCode::interpret_exit_ok()

    Описание. Для операции по просмотру этот метод указывает, что текущая строка должна быть возвращена как часть результатов просмотра и что программа должна идти дальше к следующей строке. Для других операций вызов этого метода заставляет интерпретируемую программу завершиться.

    Сигнатура.

    int interpret_exit_ok
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.39. NdbInterpretedCode::load_const_null()

    Описание. Этот метод используется, чтобы загрузить NULL в регистр.

    Сигнатура.

    int load_const_null
    (
      Uint32 RegDest
    )
    

    Параметры. Этот метод берет единственный параметр: регистр, в который нужно поместить NULL.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.40. NdbInterpretedCode::load_const_u16()

    Описание. Этот метод загружает 16-битовое значение в указанный регистр.

    Сигнатура.

    int load_const_u16
    (
      Uint32 RegDest,
      Uint32 Constant
    )
    

    Параметры.

    • RegDest: Регистр, в который должно быть загружено значение.

    • Constant значение, которое будет загружено.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.41. NdbInterpretedCode::load_const_u32()

    Описание. Этот метод загружает 32-битовое значение в указанный регистр.

    Сигнатура.

    int load_const_u32
    (
      Uint32 RegDest,
      Uint32 Constant
    )
    

    Параметры.

    • RegDest: Регистр, в который должно быть загружено значение.

    • Constant значение, которое будет загружено.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.42. NdbInterpretedCode::load_const_u64()

    Описание. Этот метод загружает 64-битовое значение в указанный регистр.

    Сигнатура.

    int load_const_u64
    (
      Uint32 RegDest,
      Uint64 Constant
    )
    

    Параметры.

    • RegDest: Регистр, в который должно быть загружено значение.

    • Constant значение, которое будет загружено.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.43. NdbInterpretedCode::read_attr()

    Описание. Метод read_attr() используется, чтобы прочитать значение столбца таблицы в регистр программы. Столбец может быть определен при помощи признака ID или как указатель на объект Column .

    Сигнатура. Этот метод можно вызвать любым из двух способов. Первый из них, ссылаясь на колонку по ее ID, как показано здесь:

    int read_attr
    (
      Uint32 RegDest,
      Uint32 attrId
    )
    

    Альтернативно, можно сослаться на колонку как на объект Column:

    int read_attr
    (
      Uint32 RegDest,
      const NdbDictionary::Column* column
    )
    

    Параметры.

    • Регистр, в который должно быть скопировано значение столбца (RegDest).

    • Любая из следующих ссылок на столбец таблицы, значение которого должно быть скопировано:

      • Признак столбца таблицы ID (attrId).

      • Указатель на объект column то есть, указатель на объект Column, ссылающийся на столбец таблицы.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.44. NdbInterpretedCode::ret_sub()

    Описание. Этот метод отмечает конец текущей подпрограммы.

    Сигнатура.

    int ret_sub
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.45. NdbInterpretedCode::sub_reg()

    Описание. Этот метод получает различие между значениями, сохраненными в любых двух данных регистрах, и хранит результат в третьем регистре.

    Сигнатура.

    int sub_reg
    (
      Uint32 RegDest,
      Uint32 RegSource1,
      Uint32 RegSource2
    )
    

    Параметры. Этот метод берет три параметра. Первым из них является регистр, в котором должен быть сохранен результат (RegDest). Второй и третий параметры (RegSource1 и RegSource2) это регистры, значения которых должны быть вычтены. Другими словами, значение регистра RegDest вычислено так:

    (значение в регистре RegSource1) -
    (значение в регистре RegSource2)
    

    Возможно снова использовать один из регистров, значения которых вычтены для хранения результата, то есть, RegDest может быть RegSource1 или RegSource2.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.24.46. NdbInterpretedCode::sub_val()

    Описание. Этот метод вычитает указанное значение из значения данного столбца таблицы и помещает оригинальные и измененные значения столбцов в регистры 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
    (
      Uint32 attrId,
      Uint32 aValue
    )
    

    64-bit aValue:

    int sub_val
    (
      Uint32 attrId,
      Uint64 aValue
    )
    

    Параметры. ID признака столбца таблицы и 32-bit или 64-bit integer значение, которое будет вычтено из значения этого столбца.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.24.47. NdbInterpretedCode::write_attr()

    Описание. Этот метод используется, чтобы скопировать значение регистра к столбцу таблицы. Столбец может быть определен при помощи признака ID или как указатель на объект Column.

    Сигнатура. Этот метод может быть вызван любым из двух способов. Первый из них требует ссылки на колонку по признаку ID, как показано здесь:

    int read_attr
    (
      Uint32 attrId,
      Uint32 RegSource
    )
    

    Можно также сослаться на колонку как на объект Column:

    int read_attr
    (
      const NdbDictionary::Column* column,
      Uint32 RegSource
    )
    

    Параметры.

    • Ссылка на столбец таблицы, в который должно быть скопировано значение регистра. Это может иметь любое значение из следующего:

      • Признак столбца таблицы ID (attrId).

      • Указатель на объект column, ссылающийся на столбец таблицы.

    • Регистр, значение которого должно быть скопировано (RegSource).

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.25. Класс NdbOperation

    Резюме

    Эта секция обсуждает класс 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.

    2.3.25.1. NdbOperation::AbortOption

    Описание. Этот тип используется, чтобы определить, должны ли неудавшиеся операции вынудить транзакцию быть прерванной. Это используется в качестве аргумента метода execute(), см. раздел 2.3.30.6.

    Возможные значения.

    Таблица 2.54.

    Имя Описание
    AbortOnError Неудавшаяся операция заставляет транзакцию прерываться.
    AO_IgnoreOnError Проигнорированы неудавшиеся операции, транзакция продолжает выполняться.
    DefaultAbortOption Значение AbortOption установлено согласно операционному типу:
    • Операции чтения: AO_IgnoreOnError.

    • Операции просмотра или DML: AbortOnError.


    См. раздел 2.3.30.6.

    2.3.25.2. NdbOperation::deleteTuple()

    Описание. Этот метод определяет NdbOperation как DELETE. Когда метод NdbTransaction::execute() вызван, операция удаляет кортеж из таблицы.

    Сигнатура.

    virtual int deleteTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.25.3. NdbOperation::equal()

    Описание. Этот метод определяет условие поиска с равенством. Условие верно, если у признака есть данное значение. Чтобы установить условия поиска на многократных признаках, используйте несколько вызовов 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,
      Int32 value
    )
    
    intequal
    (
      const char* name,
      Uint32 value
    )
    
    intequal
    (
      const char* name,
      Int64 value
    )
    
    intequal
    (
      const char* name,
      Uint64 value
    )
    
    intequal
    (
      Uint32 id,
      const char* value
    )
    
    intequal
    (
      Uint32 id,
      Int32 value
    )
    
    intequal
    (
      Uint32 id,
      Uint32 value
    )
    
    intequal
    (
      Uint32 id,
      Int64 value
    )
    
    intequal
    (
      Uint32 id,
      Uint64 value
    )
    

    Параметры.

    • Первый параметр может иметь любое из следующего:

      1. Имя name признака (последовательность).

      2. id признака unsigned 32-bit integer).

    • Второй параметр это признак value для проверки. Это значение может быть любым из следующих 5 типов:

      1. String

      2. 32-bit integer

      3. Unsigned 32-bit integer

      4. 64-bit integer

      5. Unsigned 64-bit integer

    Возвращаемое значение. -1 в случае ошибки.

    2.3.25.4. NdbOperation::getBlobHandle()

    Описание. Этот метод используется вместо getValue() или setValue() для признаков blob. Это создает обработчик blob (объект NdbBlob). Второй вызов с тем же самым аргументом возвращает ранее созданный обработчик, связанный с операцией и сохраняется автоматически.

    Сигнатура. У этого метода есть две формы, в зависимости от того, вызывают ли это с именем или ID признака blob:

    virtual NdbBlob* getBlobHandle
    (
      const char* name
    )
    

    или

    virtual NdbBlob* getBlobHandle
    (
      Uint32 id
    )
    

    Параметры. Этот метод берет единственный параметр, который может быть любой одним из следующего:

    • name: имя признака

    • id признака

    Возвращаемое значение. Независимо от используемого типа параметра, это возвращает указатель на экземпляр NdbBlob.

    2.3.25.5. NdbOperation::getLockHandle

    Описание. Возвращает указатель на обработчик блокировки текущей операции. Когда используется с 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().

    2.3.25.6. NdbOperation::getLockMode()

    Описание. Этот метод получает способ блокировки операции.

    Сигнатура.

    LockMode getLockMode
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение LockMode. См. раздел 2.3.25.15.

    2.3.25.7. NdbOperation::getNdbError()

    Описание. Этот метод получает новую ошибку (объект NdbError).

    Сигнатура.

    const NdbError& getNdbError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Объект NdbError.

    2.3.25.8. NdbOperation::getNdbErrorLine()

    Описание. Этот метод получает номер метода, в котором произошла последняя ошибка.

    Сигнатура.

    int getNdbErrorLine
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Номер метода (integer).

    2.3.25.9. NdbOperation::getTable()

    Описание. Этот метод используется, чтобы получить объект таблицы, связанный с операцией.

    Сигнатура.

    const NdbDictionary::Table* getTable
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на экземпляр Table.

    2.3.25.10. NdbOperation::getTableName()

    Описание. Этот метод получает название таблицы, используемой для операции.

    Сигнатура.

    const char* getTableName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название таблицы.

    2.3.25.11. NdbOperation::getNdbTransaction()

    Описание. Получает объект NdbTransaction.

    Сигнатура.

    virtual NdbTransaction* getNdbTransaction
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на объект NdbTransaction.

    2.3.25.12. NdbOperation::getType()

    Описание. Этот метод используется, чтобы получить тип доступа для этой операции.

    Сигнатура.

    Type getType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение Type.

    2.3.25.13. NdbOperation::getValue()

    Описание. Этот метод готовится к поиску значения атрибута. 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
    (
      Uint32 id,
      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 */
    }
    

    2.3.25.14. NdbOperation::insertTuple()

    Описание. Этот метод определяет NdbOperation для опреации INSERT. Когда NdbTransaction::execute() вызван, эта операция добавляет новый кортеж к таблице.

    Сигнатура.

    virtual int insertTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.25.15. NdbOperation::LockMode

    Описание. Этот тип описывает способ блокировки, используемый, выполняя операцию чтения.

    Возможные значения.

    Таблица 2.55.

    Имя Описание
    LM_Read Чтение с коллективной блокировкой
    LM_Exclusive Чтение с монопольной блокировкой
    LM_CommittedRead Проигнорируйте блокировку, чтение последней передачи
    LM_SimpleRead Чтение с коллективной блокировкой, но выпустите блокировку непосредственно

    Есть также поддержка грязных чтений (LM_Dirty), но это обычно только во внутренних целях и не должно использоваться для задач, развернутых в производственном режиме.

    2.3.25.16. NdbOperation::readTuple()

    Описание. Этот метод определяет операцию NdbOperation READ. Когда метод NdbTransaction::execute() вызван, операция читает кортеж.

    Сигнатура.

    virtual int readTuple
    (
      LockMode mode
    )
    

    Параметры. mode определяет способ блокировки, используемый операцией чтения. Посмотрите раздел 2.3.25.15.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.25.17. NdbOperation::setValue()

    Описание. Этот метод определяет признак, который будет установлен или обновлен.

    Есть много методов 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,
      Int32 value
    )
    
    int setValue
    (
      const char* name,
      Uint32 value
    )
    
    int setValue
    (
      const char* name,
      Int64 value
    )
    
    int setValue
    (
      const char* name,
      Uint64 value
    )
    
    int setValue
    (
      const char* name,
      float value
    )
    
    int setValue
    (
      const char* name,
      double value
    )
    
    int setValue
    (
      Uint32 id,
      const char* value
    )
    
    int setValue
    (
      Uint32 id,
      Int32 value
    )
    
    int setValue
    (
      Uint32 id,
      Uint32 value
    )
    
    int setValue
    (
      Uint32 id,
      Int64 value
    )
    
    int setValue
    (
      Uint32 id,
      Uint64 value
    )
    
    int setValue
    (
      Uint32 id,
      float value
    )
    
    int setValue
    (
      Uint32 id,
      double value
    )
    

    Параметры. Этот метод требует следующих двух параметров:

    • Первый параметр определяет признак, который будет установлен и может быть одним любым из следующего:

      1. Имя name признака (string).

      2. id признака (unsigned 32-bit integer).

    • Второй параметр value это значение, в которое должен быть установлен признак, его тип может быть любым из следующих 7 типов:

      1. String (const char*)

      2. 32-bit integer

      3. Unsigned 32-bit integer

      4. 64-bit integer

      5. Unsigned 64-bit integer

      6. Double

      7. Float

    См. раздел 2.3.25.3.

    Возвращаемое значение. -1 при ошибке.

    2.3.25.18. NdbOperation::Type

    Описание. Type используется, чтобы описать операционный тип доступа. Каждый тип доступа поддерживается NdbOperation или один из его подклассов, как показано в следующей таблице:

    Возможные значения.

    Таблица 2.56.

    Имя Описание Применимый класс
    PrimaryKeyAccess Чтение, вставка, обновление или удаление, используя первичный ключ таблицы NdbOperation
    UniqueIndexAccess Чтение, обновление или удаление, используя уникальный индекс NdbIndexOperation
    TableScan Полное сканирование таблицы NdbScanOperation
    OrderedIndexScan Упорядоченный просмотр индекса NdbIndexScanOperation

    2.3.25.19. NdbOperation::writeTuple()

    Описание. Этот метод определяет операцию NdbOperation WRITE. Когда вызван метод NdbTransaction::execute() операция пишет кортеж в таблицу. Если кортеж уже существует, он обновляется, иначе вставка происходит.

    Сигнатура.

    virtual int writeTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.25.20. NdbOperation::updateTuple()

    Описание. Этот метод определяет операцию NdbOperation UPDATE. Когда вызван метод NdbTransaction::execute(), операция обновляет кортеж, найденный в таблице.

    Сигнатура.

    virtual int updateTuple
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Returns 0 при успехе, -1 при ошибке.

    2.3.26. Класс NdbRecAttr

    Резюме

    Секция описывает класс 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 не определяет публичных типов.

    2.3.26.1. ~NdbRecAttr()

    Описание. Это деструктор класса NdbRecAttr.

    Необходимо удалить только копии объектов NdbRecAttr , которые были созданы в вашем приложении, используя метод clone().

    Сигнатура.

    ~NdbRecAttr
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Нет.

    2.3.26.2. NdbRecAttr::aRef()

    Описание. Этот метод используется, чтобы получить ссылку на значение атрибута, как указатель на char. Этот указатель выровнен соответственно для типа данных. Память освобождена API NDB, когда выполнен NdbTransaction::close() в транзакции, которая читают значение.

    Сигнатура.

    char* aRef
    (
      void
    ) const
    

    Параметры. Указатель на значение атрибута. Поскольку этот указатель постоянный, этот метод можно вызвать в любое время после NdbOperation::getValue().

    Возвращаемое значение. Нет.

    2.3.26.3. NdbRecAttr::char_value()

    Описание. Этот метод получает Char, сохраненный в объекте NdbRecAttr и возвращает его как char.

    Сигнатура.

    char char_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение char.

    2.3.26.4. NdbRecAttr::clone()

    Описание. Этот метод создает глубокую копию объекта NdbRecAttr.

    Копия, созданная этим методом, должна быть удалена приложением, когда больше не нужна.

    Сигнатура.

    NdbRecAttr* clone
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Объект NdbRecAttr. Это полная копия оригинала, включая все данные.

    2.3.26.5. NdbRecAttr::double_value()

    Описание. Этот метод получает значение Double, сохраненное в объекте NdbRecAttr и возвращает его как double.

    Сигнатура.

    double double_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение double (8 байт).

    2.3.26.6. NdbRecAttr::float_value()

    Описание. Этот метод получает значение Float, сохраненное в объекте NdbRecAttr и возвращает его как float.

    Сигнатура.

    float float_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение float (4 байта).

    2.3.26.7. NdbRecAttr::get_size_in_bytes()

    Описание. Можно использовать этот метод, чтобы получить размер признака (элемента).

    Сигнатура.

    Uint32 get_size_in_bytes
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Размер признака в байтах как unsigned 32-bit integer.

    2.3.26.8. NdbRecAttr::getColumn()

    Описание. Этот метод используется, чтобы получить колонку, которой принадлежит признак.

    Сигнатура.

    const NdbDictionary::Column* getColumn
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на объект Column.

    2.3.26.9. NdbRecAttr::getType()

    Описание. Этот метод используется, чтобы получить тип данных колонки.

    Сигнатура.

    NdbDictionary::Column::Type getType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение Column::Type.

    2.3.26.10. NdbRecAttr::int8_value()

    Описание. Этот метод получает значение Small, сохраненное в объекте NdbRecAttr и возвращает как 8-bit signed integer.

    Сигнатура.

    int8 int8_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 8-bit signed integer.

    2.3.26.11. NdbRecAttr::int32_value()

    Описание. Этот метод получает значение Int, сохраненное в объекте NdbRecAttr и возвращает как 32-bit signed integer.

    Сигнатура.

    int32 int32_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit signed integer.

    2.3.26.12. NdbRecAttr::int64_value()

    Описание. Этот метод получает значение Bigint, сохраненное в объекте NdbRecAttr и возвращает как 64-bit signed integer.

    Сигнатура.

    int64 int64_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 64-bit signed integer.

    2.3.26.13. NdbRecAttr::isNULL()

    Описание. Этот метод проверяет, является ли значение атрибута NULL.

    Сигнатура.

    int isNULL
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Одно из следующих трех значений:

    • -1: Значение атрибута не определяется из-за ошибки.

    • 0: Значение атрибута определяется, но не NULL.

    • 1: Значение атрибута определяется и NULL.

    Если NdbTransaction::execute() еще не был вызван, значение, возвращенное isNULL() не определяется.

    2.3.26.14. NdbRecAttr::medium_value()

    Описание. Этот метод получает значение Mediumint, сохраненное в объекте NdbRecAttr и возвращает как 32-bit signed integer.

    Сигнатура.

    int32 medium_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit signed integer.

    2.3.26.15. NdbRecAttr::short_value()

    Описание. Этот метод получает значение Smallint, сохраненное в объекте NdbRecAttr и возвращает как 16-bit signed integer (short).

    Сигнатура.

    short short_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 16-bit signed integer.

    2.3.26.16. NdbRecAttr::u_8_value()

    Описание. Этот метод получает значение Smallunsigned, сохраненное в объекте NdbRecAttr и возвращает как 8-bit unsigned integer.

    Сигнатура.

    Uint8 u_8_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 8-bit unsigned integer.

    2.3.26.17. NdbRecAttr::u_32_value()

    Описание. Этот метод получает значение Unsigned, сохраненное в объекте NdbRecAttr и возвращает как 32-bit unsigned integer.

    Сигнатура.

    Uint32 u_32_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit unsigned integer.

    2.3.26.18. NdbRecAttr::u_64_value()

    Описание. Этот метод получает значение Bigunsigned, сохраненное в объекте NdbRecAttr и возвращает как 64-bit unsigned integer.

    Сигнатура.

    Uint64 u_64_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 64-bit unsigned integer.

    2.3.26.19. NdbRecAttr::u_char_value()

    Описание. Этот метод получает значение Char, сохраненное в объекте NdbRecAttr и возвращает как unsigned char.

    Сигнатура.

    Uint8 u_char_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 8-bit unsigned char.

    2.3.26.20. NdbRecAttr::u_medium_value()

    Описание. Этот метод получает значение Mediumunsigned, сохраненное в объекте NdbRecAttr и возвращает как 32-bit unsigned integer.

    Сигнатура.

    Uint32 u_medium_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit unsigned integer.

    2.3.26.21. NdbRecAttr::u_short_value()

    Описание. Этот метод получает значение Smallunsigned, сохраненное в объекте NdbRecAttr и возвращает как 16-bit (short) unsigned integer.

    Сигнатура.

    Uint16 u_short_value
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. short (16-bit) unsigned integer.

    2.3.27. Интерфейс NdbRecord

    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.

    2.3.28. Класс NdbScanFilter

    Резюме

    Эта секция обсуждает класс 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(int columnId,
           Uint32 value)
    {
      return cmp(BinaryCondition::COND_EQ,
                 columnId,
                 &value, 4);
    }
    

    Типы. Класс NdbScanFilter определяет два публичных типа:

    • BinaryCondition: Тип условия, такой как нижняя или верхняя граница.

    • Group: Логический оператор группировки, такой как AND или OR.

    2.3.28.1. NdbScanFilter::begin()

    Описание. Этот метод используется, чтобы начать комплекс и определяет логический оператор для группировки условий, составляющих комплекс. По умолчанию AND.

    Сигнатура.

    int begin
    (
      Group group = AND
    )
    

    Параметры. Значение Group: одно из AND, OR, NAND или NOR. См. раздел 2.3.28.14.

    Возвращаемое значение. 0 при успехе, -1 при ошибке.

    2.3.28.2. NdbScanFilter::BinaryCondition

    Описание. Этот тип представляет условие на основе сравнения значения столбца с некоторым произвольным значением, то есть, связанное условие. значение этого типа используется в качестве первого аргумента 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.

    2.3.28.3. NdbScanFilter::cmp()

    Описание. Этот метод используется, чтобы определить сравнение между данным значением и значением колонки. Начиная с NDB 8.0.18, это может также использоваться, чтобы сравнить две колонки. Этот метод на самом деле не выполняет сравнение, которое сделано позже, выполняя просмотр для которого определен этот NdbScanFilter.

    Во многих случаях, где значение, которое будет сравнено, является целым числом, можно вместо этого использовать один из нескольких удобных методов, обеспеченных NdbScanFilter. См. здесь.

    Сигнатура.

    int cmp
    (
      BinaryCondition condition,
      int columnId,
      const void* value,
      Uint32 length = 0
    )
    

    Дополнительно в NDB 8.0.18 и позже:

    int cmp
    (
      BinaryCondition condition,
      int ColumnId1,
      int ColumnId2
    )
    

    Параметры. Когда используется, чтобы сравнить значение с колонкой, этот метод берет следующие параметры:

    • 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 при неудаче.

    2.3.28.4. Конструктор NdbScanFilter

    Описание. Это метод конструктора для NdbScanFilter и создает новый экземпляр класса.

    Сигнатура.

    NdbScanFilter
    (
      class NdbOperation* op
    )
    

    Параметры. Этот метод берет единственный параметр, указатель на NdbOperation, к которому применяется фильтр.

    Возвращаемое значение. Новый экземпляр NdbScanFilter.

    Деструктор. Деструктор не берет аргументов и не возвращает значение. Это нужно вызвать, чтобы удалить объект NdbScanFilter, когда это больше не нужно.

    2.3.28.5. NdbScanFilter::end()

    Описание. Этот метод заканчивает комплекс, сигнализируя, что больше нет условий, которые будут добавлены к нему.

    Сигнатура.

    int end
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе или -1 при неудаче.

    2.3.28.6. NdbScanFilter::eq()

    Описание. Этот метод используется, чтобы выполнить тест на равенство значения столбца и целого числа.

    Сигнатура.

    int eq
    (
      int ColId,
      Uint32 value
    )
    

    или

    int eq
    (
      int ColId,
      Uint64 value
    )
    

    Параметры.

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым нужно сравнить значение столбца, это целое число может быть 32 бита или 64 бита и в любом случае unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.7. NdbScanFilter::isfalse()

    Описание. Определяет термин текущей группы как FALSE.

    Сигнатура.

    int isfalse
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.8. NdbScanFilter::isnotnull()

    Описание. Этот метод используется, чтобы проверить, не является ли значение столбца NULL.

    Сигнатура.

    int isnotnull
    (
      int ColId
    )
    

    Параметры. ID колонки, значение которой должно быть проверено.

    Возвращаемое значение. 0, если столбец не NULL.

    2.3.28.9. NdbScanFilter::isnull()

    Описание. Этот метод используется, чтобы проверить, является ли значение столбца NULL.

    Сигнатура.

    int isnull
    (
      int ColId
    )
    

    Параметры. ID колонки, значение которой должно быть проверено.

    Возвращаемое значение. 0, если столбец NULL.

    2.3.28.10. NdbScanFilter::istrue()

    Описание. Определяет термин текущей группы как TRUE.

    Сигнатура.

    int istrue
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.11. NdbScanFilter::ge()

    Описание. Этот метод используется, чтобы выполнить тест больше чем или равно на значении столбца и целом числе.

    Сигнатура. Этот метод принимает 32-битные и 64-битные значения:

    int ge
    (
      int ColId,
      Uint32 value
    )
    
    int ge
    (
      int ColId,
      Uint64 value
    )
    

    Параметры. Аналогично eq(), lt(), le() и другим методам типа NdbScanFilter, этот метод берет два параметра:

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым нужно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и всегда unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.12. NdbScanFilter::getNdbError()

    Описание. Поскольку ошибки, с которыми сталкиваются, строя NdbScanFilter не распространяются на вовлеченный объект to any involved NdbOperation, необходимо использовать этот метод, чтобы получить доступ к информации об ошибке.

    Сигнатура.

    const NdbError& getNdbError
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Ссылка на NdbError.

    2.3.28.13. NdbScanFilter::getNdbOperation()

    Описание. Если NdbScanFilter был построен с NdbOperation, этот метод может использоваться, чтобы получить указатель на объект NdbOperation.

    Сигнатура.

    NdbOperation* getNdbOperation
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на NdbOperation, связанный с этим NdbScanFilter, если он есть, иначе NULL.

    2.3.28.14. NdbScanFilter::Group

    Описание. Этот тип используется, чтобы описать логические операторы и используется с методом begin(), см. раздел 2.3.28.1.

    Возможные значения.

    Таблица 2.61.

    Значение Описание
    AND Логический AND: A AND B AND C
    OR Логический OR: A OR B OR C
    NAND Логический NOT AND: NOT (A AND B AND C)
    NOR Логический NOT OR: NOT (A OR B OR C)

    2.3.28.15. NdbScanFilter::gt()

    Описание. Этот метод используется, чтобы выполнить тест больше чем (строгая верхняя граница) на значении столбца и целом числе.

    Сигнатура. Этот метод берет значения 32-bit и 64-bit:

    int gt
    (
      int ColId,
      Uint32 value
    )
    
    int gt
    (
      int ColId,
      Uint64 value
    )
    

    Параметры.

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым можно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и всегда unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.16. NdbScanFilter::le()

    Описание. Этот метод используется, чтобы выполнить тест меньше чем или равно на значении столбца и целом числе.

    Сигнатура. У этого метода есть два варианта, чтобы обработать 32-битные и 64-битные значения:

    int le
    (
      int ColId,
      Uint32 value
    )
    
    int le
    (
      int ColId,
      Uint64 value
    )
    

    Параметры.

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым нужно сравнить значение столбца, это целое число может составлять 32 бита или 64 бита, в любом случае unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.17. NdbScanFilter::lt()

    Описание. Этот метод используется, чтобы провести тест меньше (строгая нижняя граница) на значении столбца и целом числе.

    Сигнатура.

    int lt
    (
      int ColId,
      Uint32 value
    )
    
    int lt
    (
      int ColId,
      Uint64 value
    )
    

    Параметры.

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым можно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.28.18. NdbScanFilter::ne()

    Описание. Этот метод используется, чтобы выполнить тест на неравенство на значении столбца и целом числе.

    Сигнатура.

    int ne
    (
      int ColId,
      Uint32 value
    )
    
    int ne
    (
      int ColId,
      Uint64 value
    )
    

    Параметры.

    • ID (ColId) колонки, значение которой должно быть проверено

    • integer с которым нужно сравнить значение столбца, это целое число может составлять 32 бита или 64 бита и unsigned.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.29. Класс NdbScanOperation

    Резюме

    Эта секция описывает класс 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.

    2.3.29.1. NdbScanOperation::close()

    Описание. Запрос этого метода закрывает просмотр. Строки, возвращенные этим просмотром, больше недоступны после того, как просмотр был закрыт, используя этот метод.

    См. здесь для получения информации о многократных потоках, пытающихся выполнить тот же самый просмотр с монопольной блокировкой и как это может затронуть закрытие просмотров.

    Сигнатура.

    void close
    (
      bool forceSend = false,
      bool releaseOp = 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.

    Возвращаемое значение. Нет.

    2.3.29.2. NdbScanOperation::deleteCurrentTuple()

    Описание. Этот метод используется, чтобы удалить текущий кортеж.

    Сигнатура.

    const NdbOperation* deleteCurrentTuple
    (
      NdbTransaction* takeOverTrans,
      const NdbRecord* record,
      char* row = 0,
      const unsigned char* mask = 0,
      const NdbOperation::OperationOptions* opts = 0,
      Uint32 sizeOfOpts = 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 при неудаче.

    2.3.29.3. NdbScanOperation::getNdbTransaction()

    Описание. Получает объект NdbTransaction для этого просмотра.

    Сигнатура.

    NdbTransaction* getNdbTransaction
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на объект NdbTransaction.

    2.3.29.4. NdbScanOperation::getPruned()

    Описание. Этот метод используется, чтобы определить, была ли данная операция по просмотру сокращена к единственному разделению. Для просмотров, определенных, используя NdbRecord, getPruned() действительно только после того, как просмотр был выполнен.

    Сигнатура.

    bool getPruned
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если просмотр сокращен к единственному разделению таблицы.

    2.3.29.5. NdbScanOperation::lockCurrentTuple()

    Описание. Этот метод блокирует текущий кортеж.

    Сигнатура. В 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,
      Uint32 sizeOfOptions = 0
    )
    

    Параметры (старый стиль). Этот метод берет единственный дополнительный параметр: транзакцию, которая должна выполнить блокировку. Если это опущено, транзакция текущая.

    Параметры (используя NdbRecord). Используя интерфейс NdbRecord, этот метод берет эти параметры, как описано в следующем списке:

    • Транзакция (takeOverTrans ), которая должна выполнить блокировку, используя NdbRecord с просмотрами, этот параметр не дополнительный.

    • NdbRecord , ссылающийся на просмотр. Это требуется, даже если никакие записи не читаются.

    • Строка row из которой читать. Если чтение не планируется, установите в NULL.

    • Указатель mask дополнительный. Если это присутствует, то просматриваются только колонки, для которых установлен соответствующий бит в маске.

    • opts может взять любое значение из следующих OperationOptions: OO_ABORTOPTION, OO_GETVALUE и OO_ANYVALUE.

    • Если варианты определяются, их длина (sizeOfOptions) должна быть определена также.

    Возвращаемое значение. Этот метод возвращает указатель на объект NdbOperation или NULL.

    2.3.29.6. NdbScanOperation::nextResult()

    Описание. Этот метод используется, чтобы получить следующий кортеж в транзакции просмотра. После каждого вызова 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
    (
      bool fetchAllowed = true,
      bool forceSend = false
    )
    

    Также возможно использовать этот метод как показано здесь:

    int nextResult
    (
      const char*& outRow,
      bool fetchAllowed = true,
      bool forceSend = 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.

    2.3.29.7. NdbScanOperation::readTuples()

    Описание. Этот метод используется, чтобы выполнить просмотр.

    Сигнатура.

    virtual int readTuples
    (
      LockMode mode = LM_Read,
      Uint32 flags = 0,
      Uint32 parallel = 0,
      Uint32 batch = 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 при ошибке.

    2.3.29.8. NdbScanOperation::restart()

    Описание. Используйте этот метод, чтобы перезапустить просмотр, не изменяя ни одного из вызовов getValue() или условий поиска.

    Сигнатура.

    int restart
    (
      bool forceSend = false
    )
    

    Параметры. Вызовите этот метод с forceSend = true, чтобы вынудить транзакцию быть посланной.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.29.9. NdbScanOperation::ScanFlag

    Описание. Значения этого типа флаги просмотра, используемые с методом readTuples(). Больше чем один может использоваться, в этом случае, они объединены OR как второй аргумент метода. Посмотрите раздел 2.3.29.7.

    Возможные значения.

    Таблица 2.64.

    Значение Описание
    SF_TupScan Просмотр в порядке TUP (то есть, в порядке строк в памяти). Относится только к сканированию таблицы.
    SF_DiskScan Просмотр в дисковом порядке (порядок строк на диске). Относится только к сканированию таблицы.
    SF_OrderBy

    Упорядоченный просмотр индекса (возрастание), строки, возвращенные из просмотра индекса, сортированы по ключу индекса. Просмотры в порядке по возрастанию или в порядке по убыванию затронуты этим флагом, который заставляет API выполнять сортировку слиянием среди упорядоченных просмотров каждого фрагмента, чтобы получить единственный сортированный набор результатов.

    Примечания:

    • Упорядоченные индексы распределяются с одним упорядоченным индексом для каждого фрагмента таблицы.

    • Просмотры диапазона часто параллельны через все фрагменты индекса. Иногда они могут быть сокращены к одному фрагменту индекса.

    • Каждый просмотр диапазона фрагмента индекса может возвратить результаты в порядке по возрастанию или в порядке по убыванию. Возрастание это умолчание, чтобы выбрать порядок по убыванию, установите флаг SF_Descending.

    • Когда многократные фрагменты индекса просматриваются параллельно, результаты передают обратно в NDB, где они могут произвольно быть сортированы слиянием прежде чем быть возвращенным пользователю. Этой сортировкой слияния управляют, используя флаги SF_OrderBy и SF_OrderByFull.

    • Если не используются SF_OrderBy или SF_OrderByFull, результаты каждого фрагмента индекса в определенном порядке (возрастание или убывание), но результаты различных фрагментов могут быть чередованы.

    • Используя SF_OrderBy или SF_OrderByFull, некоторые дополнительные ограничения наложены внутренне, они перечисляются здесь:

      1. Если просмотр диапазона не сокращен к одному фрагменту индекса, все фрагменты индекса должны быть просмотрены параллельно. Неупорядоченный просмотр может быть выполнен с менее чем полным параллелизмом.

      2. Следствия каждого фрагмента индекса должны быть доступными прежде, чем возвратить любые строки, чтобы гарантировать правильную сортировку слиянием. Это преобразовывает в последовательную форму прокуртку просмотра, потенциально приводящую к более низкой пропускной способности строки.

      3. Неупорядоченные просмотры могут возвратить строки клиенту 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.

    2.3.29.10. NdbScanOperation::updateCurrentTuple()

    Описание. Этот метод используется, чтобы обновить текущий кортеж.

    Сигнатура. Первоначально, этот метод можно было вызвать с одним дополнительным параметром, любым из способов, показанных здесь:

    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.

    2.3.30. Класс NdbTransaction

    Резюме

    Эта секция описывает класс NdbTransaction и его публичные члены.

    Родительский класс. Нет.

    Дочерние классы. Нет.

    Описание. Транзакция представляется в API NDB объектом NdbTransaction, который принадлежит объекту Ndb и создается, используя Ndb::startTransaction(). Транзакция состоит из списка операций, представленных классом NdbOperation или одним из его подклассов: NdbScanOperation, NdbIndexOperation или NdbIndexScanOperation. Каждый операционный доступ обрабатывает точно одну таблицу.

    Используя транзакции. После получения объекта NdbTransaction это используется следующим образом:

    1. Операция ассигнуется транзакцией, используя любой из следующих методов:

      • getNdbOperation()

      • getNdbScanOperation()

      • getNdbIndexOperation()

      • getNdbIndexScanOperation()

      Запрос одного из этих методов определяет операцию. Несколько операций могут быть определены на том же самом объекте NdbTransaction, в этом случае они выполняются параллельно. Когда все операции определяются, метод execute() посылает их в ядро NDB на выполнение.

    2. Метод execute() возвращается когда ядро NDB закончило выполнение всех ранее определенных операций.

      Все ассигнованные операции должны быть правильно определены до вызова метода execute().

    3. 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() Определяет, должна ли транзакция быть передана или отменена

    2.3.30.1. NdbTransaction::close()

    Описание. Этот метод закрывает транзакцию. Это эквивалентно запросу Ndb::closeTransaction().

    Если транзакция еще не была передана, она прерывается, когда этот метод вызывают. Посмотрите раздел 2.3.16.35.

    Сигнатура.

    void close
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Нет.

    2.3.30.2. NdbTransaction::commitStatus()

    Описание. Этот метод получает статус передачи транзакции.

    Сигнатура.

    CommitStatusType commitStatus
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Значение CommitStatusType, см. раздел 2.3.30.3.

    2.3.30.3. NdbTransaction::CommitStatusType

    Описание. Этот тип используется, чтобы описать статус передачи транзакции.

    Возможные значения.

    Таблица 2.67.

    Имя Описание
    NotStarted Транзакция еще не была начата.
    Started Транзакция началась, но еще не передается.
    Committed Транзакция закончилась и была передана.
    Aborted Транзакция была прервана.
    NeedAbort Транзакция столкнулась с ошибкой, но еще не была прервана.

    Статус передачи транзакции можно прочитать с помощью метода commitStatus(), см. раздел 2.3.30.2.

    2.3.30.4. NdbTransaction::deleteTuple()

    Описание. Удаляет кортеж с использованием 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,
      Uint32 sizeOfOptions = 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 представление этой операции записи. Операция может быть проверена при необходимости.

    2.3.30.5. NdbTransaction::ExecType

    Описание. Этот тип устанавливает тип выполнения транзакции, то есть, должно ли это выполнить, выполнить и передать или аварийно завершить работу. Это применяется в качестве параметра метода execute(), см. раздел 2.3.30.6.

    Возможные значения.

    Таблица 2.68.

    Имя Описание
    NoCommit Транзакция должна выполнить, но не передать.
    Commit Транзакция должна выполнить и быть передана.
    Rollback Транзакция должна быть отменена.

    2.3.30.6. NdbTransaction::execute()

    Описание. Этот метод используется, чтобы выполнить транзакцию.

    Сигнатура.

    int execute
    (
      ExecType execType,
      NdbOperation::AbortOption abortOption = NdbOperation::DefaultAbortOption,
      int force = 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);
    

    2.3.30.7. NdbTransaction::executePendingBlobOps()

    Описание. Этот метод выполняет транзакцию с ExecType=NoCommit , если там остаются какими-либо операциями по части blob данных типов, которые еще не были выполнены.

    Сигнатура.

    int executePendingBlobOps
    (
      Uint8 flags = 0xFF
    )
    

    Параметры. flags результат побитового OR, равный 1 << optype, где optype это NdbOperation::Type. Умолчание соответствует PrimaryKeyAccess.

    Возвращаемое значение. 0 при успехе, -1 при неудаче. То, что транзакция не прерывалась, не обязательно означает, что каждая операция была успешна, необходимо проверить каждую операцию индивидуально на ошибки.

    2.3.30.8. NdbTransaction::getGCI()

    Описание. Этот метод получает ID глобальной контрольной точки (GCI) транзакции.

    Каждая переданная транзакция принадлежит GCI. Регистрация для переданной транзакции сохранена яна диске, когда глобальная контрольная точка происходит.

    Сравнивая GCI транзакции с значением последнего GCI в перезапущенном NDB Cluster, можно определить, была ли транзакция восстановлена.

    Была ли глобальная контрольная точка с этим GCI сохранена на диске, не может быть определено этим методом.

    GCI для транзакции просмотра не определен, так как никакие обновления не выполняются в транзакциях просмотра.

    Сигнатура.

    int getGCI
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. GCI транзакции или -1, если ни один недоступен.

    Никакой GCI не доступен до execute() с ExecType::Commit.

    2.3.30.9. NdbTransaction::getMaxPendingBlobReadBytes()

    Описание. Получает текущий пакетный размер в байтах для операций чтения BLOB. Когда объем данных volume of BLOB, которые будут прочитаны в данной транзакции, превышает этот размер, все операции чтения в транзакции выполняются.

    Сигнатура.

    Uint32 getMaxPendingBlobReadBytes
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Текущий пакетный размер в байтах. См. раздел 2.3.30.26.

    2.3.30.10. NdbTransaction::getMaxPendingBlobWriteBytes()

    Описание. Получает текущий пакетный размер в байтах для операции записи BLOB. Когда объем данных BLOB, которые будут написаны в данной транзакции, превышает это значение, все операции записи в транзакции выполняются.

    Сигнатура.

    Uint32 getMaxPendingBlobWriteBytes
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Текущий пакетный размер в байтах. Посмотрите раздел 2.3.30.27.

    2.3.30.11. NdbTransaction::getNdbError()

    Описание. Этот метод используется, чтобы получить новую ошибку (NdbError ).

    Сигнатура.

    const NdbError& getNdbError
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Ссылка на объект NdbError.

    См. раздел 1.3.2.3.6.

    2.3.30.12. NdbTransaction::getNdbErrorLine()

    Описание. Этот метод возвращает номер строки, где новая ошибка произошла.

    Сигнатура.

    int getNdbErrorLine
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Номер строки новой ошибки.

    Для получения дополнительной информации об ошибках из-за неправильного обращения в транзакциях посмотрите раздел 1.3.2.3.6.

    2.3.30.13. NdbTransaction::getNdbErrorOperation()

    Описание. Этот метод получает операцию, которая вызвала ошибку.

    Чтобы получить больше информации о фактической ошибке, используйте метод NdbOperation::getNdbError() объекта NdbOperation, возвращенного getNdbErrorOperation().

    Сигнатура.

    NdbOperation* getNdbErrorOperation
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на NdbOperation.

    Для получения дополнительной информации об ошибках из-за неправильного обращения в транзакциях посмотрите раздел 1.3.2.3.6.

    2.3.30.14. NdbTransaction::getNdbIndexOperation()

    Описание. Этот метод используется, чтобы создать NdbIndexOperation, связанный с данной таблицей.

    Все операции по индексу в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.

    Сигнатура.

    NdbIndexOperation* getNdbIndexOperation
    (
      const NdbDictionary::Index* index
    )
    

    Параметры. Объект Index, на котором должна быть выполнена операция.

    Возвращаемое значение. Указатель на новый NdbIndexOperation.

    2.3.30.15. NdbTransaction::getNdbIndexScanOperation()

    Описание. Этот метод используется, чтобы создать NdbIndexScanOperation, связанный с данной таблицей.

    Все операции по просмотру индекса в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.

    Сигнатура.

    NdbIndexScanOperation* getNdbIndexScanOperation
    (
      const NdbDictionary::Index* index
    )
    

    Параметры. Объект Index, на котором должна быть выполнена операция.

    Возвращаемое значение. Указатель на новый NdbIndexScanOperation.

    2.3.30.16. NdbTransaction::getNdbOperation()

    Описание. Этот метод используется, чтобы создать NdbOperation, связанный с данной таблицей.

    Все операции в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.

    Сигнатура.

    NdbOperation* getNdbOperation
    (
      const NdbDictionary::Table* table
    )
    

    Параметры. Объект Table, на котором должна быть выполнена операция.

    Возвращаемое значение. Указатель на новый NdbOperation.

    2.3.30.17. NdbTransaction::getNdbScanOperation()

    Описание. Этот метод используется, чтобы создать NdbScanOperation, связанный с данной таблицей.

    Все операции по просмотру в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.

    Сигнатура.

    NdbScanOperation* getNdbScanOperation
    (
      const NdbDictionary::Table* table
    )
    

    Параметры. Объект Table, на котором должна быть выполнена операция.

    Возвращаемое значение. Указатель на новый NdbScanOperation.

    2.3.30.18. NdbTransaction::getNextCompletedOperation()

    Описание. Этот метод используется, чтобы получить законченные действия транзакции. Это, как правило, используется, чтобы получить все операции, принадлежащие данной транзакции, чтобы проверить ошибки.

    NdbTransaction::getNextCompletedOperation(NULL) возвращает транзакции первого объекта NdbOperation, NdbTransaction::getNextCompletedOperation( myOp) возвращает объект NdbOperation, определенный после NdbOperation myOp.

    Этот метод должен использоваться только после того, как транзакция была выполнена, но прежде чем транзакция была закрыта.

    Сигнатура.

    const NdbOperation* getNextCompletedOperation
    (
      const NdbOperation* op
    ) const
    

    Параметры. Этот метод требует единственный параметр op, который является операцией (объект NdbOperation) или NULL.

    Возвращаемое значение. Операция после op или первая операция, определенная для транзакции, если getNextCompletedOperation() был вызван, используя NULL.

    2.3.30.19. NdbTransaction::getTransactionId()

    Описание. Этот метод используется, чтобы получить ID транзакции.

    Сигнатура.

    Uint64 getTransactionId
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. ID транзакции как unsigned 64-bit integer.

    2.3.30.20. NdbTransaction::insertTuple()

    Описание. Вставляет кортеж с использованием 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,
      Uint32 sizeOfOptions = 0
    )
    
    const NdbOperation* insertTuple
    (
      const NdbRecord* combined_rec,
      const char* combined_row,
      const unsigned char* mask = 0,
      const NdbOperation::OperationOptions* opts = 0,
      Uint32 sizeOfOptions = 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 представление этой операции по вставке.

    2.3.30.21. NdbTransaction::readTuple()

    Описание. Этот метод читает кортеж с использованием объектов NdbRecord .

    Сигнатура.

    const NdbOperation* readTuple
    (
      const NdbRecord* key_rec,
      const char* key_row,
      const NdbRecord* result_rec,
      char* result_row,
      NdbOperation::LockMode lock_mode = NdbOperation::LM_Read,
      const unsigned char* result_mask = 0,
      const NdbOperation::OperationOptions* opts = 0,
      Uint32 sizeOfOptions = 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 представление этой операции чтения (это может использоваться, чтобы проверить ошибки).

    2.3.30.22. NdbTransaction::refresh()

    Описание. Этот метод обновляет тайм-аут транзакции и таким образом избегает прерывания из-за тайм-аута транзакции.

    Нежелательно взять блокировку на записи и поддержать ее в течение расширенного времени, так как это может повлиять на другие транзакции.

    Сигнатура.

    int refresh
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. 0 при успехе, -1 при неудаче.

    2.3.30.23. NdbTransaction::releaseLockHandle()

    Описание. Этот метод используется, чтобы выпустить обработчик блокировки (см. раздел 2.3.25.5), когда это больше не требуется. Для NdbRecord операции чтения первичного ключа это нельзя вызвать, пока связанная операция чтения не была выполнена.

    Все обработчики блокировки, связанные с данной транзакцией, сняты, когда транзакция закрыта.

    Сигнатура.

    int releaseLockHandle
    (
      const NdbLockHandle* lockHandle
    )
    

    Параметры. Объект NdbLockHandle для освобождения.

    Возвращаемое значение. 0 при успехе.

    2.3.30.24. NdbTransaction::scanIndex()

    Описание. Выполните просмотр диапазона индекса таблицы с необязательным упорядочиванием.

    Сигнатура.

    NdbIndexScanOperation* scanIndex
    (
      const NdbRecord* key_record,
      const NdbRecord* result_record,
      NdbOperation::LockMode lock_mode = NdbOperation::LM_Read,
      const unsigned char* result_mask = 0,
      const NdbIndexScanOperation::IndexBound* bound = 0,
      const NdbScanOperation::ScanOptions* options = 0,
      Uint32 sizeOfOptions = 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, который может использоваться для проверки на ошибки.

    2.3.30.25. NdbTransaction::scanTable()

    Описание. Этот метод выполняет сканирование таблицы, используя объект NdbRecord, чтобы читать данные столбца.

    Сигнатура.

    NdbScanOperation* scanTable
    (
      const NdbRecord* result_record,
      NdbOperation::LockMode lock_mode = NdbOperation::LM_Read,
      const unsigned char* result_mask = 0,
      Uint32 scan_flags = 0,
      Uint32 parallel = 0,
      Uint32 batch = 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 представление этого просмотра. Операция может быть проверена при необходимости.

    2.3.30.26. NdbTransaction::setMaxPendingBlobReadBytes()

    Описание. Устанавливает пакетный размер в байтах для операции чтения BLOB. Когда объем данных BLOB, которые будут прочитаны в данной транзакции, превышает этот размер, все операции чтения в транзакции выполняются.

    Сигнатура.

    void setMaxPendingBlobReadBytes
    (
      Uint32 bytes
    )
    

    Параметры. Пакетный размер, как количество байт bytes. Используя 0 можно выключить пакетное чтение BLOB, что является поведением по умолчанию (для обратной совместимости).

    Возвращаемое значение. Нет.

    Пакетным чтением BLOB можно также управлять в клиенте mysql и другом клиентском приложении MySQL, используя опцию MySQL Server --ndb-blob-read-batch-bytes и связанные системные переменные MySQL Server.

    2.3.30.27. NdbTransaction::setMaxPendingBlobWriteBytes()

    Описание. Устанавливает пакетный размер в байтах для операции записи BLOB. Когда объем данных volume of BLOB, которые будут записаны в данной транзакции, превышает этот размер, все операции записи в транзакции выполняются.

    Сигнатура.

    void setMaxPendingBlobWriteBytes
    (
      Uint32 bytes
    )
    

    Параметры. Пакетный размер, как количество байт bytes. Используя 0 можно выключить пакетную запись BLOB, что является поведением по умолчанию (для обратной совместимости).

    Возвращаемое значение. Нет.

    Пакетной записью BLOB можно также управлять в клиенте mysql и другом клиентском приложении MySQL, используя опцию MySQL Server --ndb-blob-write-batch-bytes и связанные системные переменные MySQL Server.

    2.3.30.28. NdbTransaction::setSchemaObjectOwnerChecks()

    Описание. Включает или отключает проверку собственности объекта схемы, когда многократные объекты 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 запрещает.

    Возвращаемое значение. Нет.

    2.3.30.29. NdbTransaction::unlock()

    Описание. Этот метод создает операцию разблокировки на текущей транзакции, когда выполнено, операция удаляет блокировку, на которую ссылаются NdbLockHandle (см. раздел 2.3.25.5), переданный этому методу.

    Сигнатура.

    const NdbOperation* unlock
    (
      const NdbLockHandle* lockHandle,
      NdbOperation::AbortOption ao = NdbOperation::DefaultAbortOption
    )
    

    Параметры. Указатель на обработчик блокировки, кроме того, произвольно, AbortOption значение ao.

    Если операция терпит неудачу, AbortOption определяет, как это обработано, по умолчанию ошибки заставляют транзакции прерываться.

    Возвращаемое значение. Указатель на NdbOperation (созданная операция).

    2.3.30.30. NdbTransaction::updateTuple()

    Описание. Обновляет кортеж, используя объект 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,
      Uint32 sizeOfOptions = 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 представление этой операции (может использоваться, чтобы проверить ошибки).

    2.3.30.31. NdbTransaction::writeTuple()

    Описание. Этот метод используется с 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,
      Uint32 sizeOfOptions = 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 представление этой операции записи. Операция может быть проверена по мере необходимости.

    2.3.31. Класс Object

    Резюме

    Этот класс обеспечивает метаинформацию об объектах базы данных, таких как таблицы и индексы. Подклассы 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)

    2.3.31.1. Object::FragmentType

    Резюме

    Этот тип описывает тип фрагментации Object.

    Описание. Этот параметр определяет, как данные в таблице или индексе распределяются среди узлов хранения кластера, то есть, количество фрагментов на узел. Чем больше таблица, тем больше количество фрагментов, которые должны использоваться. Обратите внимание на то, что все точные копии считаются единственным фрагментом. Для таблицы умолчание FragAllMedium. Для уникального хэш-индекса умолчание взято из базовой таблицы и не может в настоящее время изменяться.

    Возможные значения.

    Таблица 2.72.

    Имя Описание
    FragUndefined Тип фрагментации не определен или умолчание
    FragAllMedium Два фрагмента на узел
    FragAllLarge Четыре фрагмента на узел
    DistrKeyHash Распределенный хэш-ключ
    DistrKeyLin Распределенный линейный хэш-ключ
    UserDefined Определено пользователем
    HashMapPartition Разделение хэш-карты

    2.3.31.2. Object::PartitionBalance

    Описание. Этот тип обеспечивает параметры настройки баланса разделения (типы количества фрагмента), из которого можно выбрать, используя 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. Эти значения соответствуют показанным в предыдущей таблице в показанном порядке.

    2.3.31.3. Object::State

    Резюме

    Этот тип описывает состояние Object.

    Описание. Этот параметр предоставляет нам состояние объекта. По state определяется, создан ли объект и находится ли в применимом состоянии.

    Возможные значения.

    Таблица 2.74.

    Имя Описание
    StateUndefined Неопределенный
    StateOffline Офлайн, не применимый
    StateBuilding Создается, не применимый (?)
    StateDropping Переход в офлайн или удаление, не применимый
    StateOnline Онлайн, применимый
    StateBackup Онлайн, резервируется, применимый
    StateBroken Поврежден, должен быть удален и воссоздан

    2.3.31.4. Object::Status

    Резюме

    Этот тип описывает статус Object.

    Описание. Чтение объекта Status говорит, доступно ли это в ядре NDB.

    Возможные значения.

    Таблица 2.75.

    Имя Описание
    New Объект существует только в памяти и еще не был создан в ядре NDB
    Changed Объект был изменен в памяти и должен быть передан в ядро NDB для вступления в силу изменений
    Retrieved Объект существует и был прочитан в оперативную память из ядра NDB
    Invalid Объект был лишен законной силы и больше не должен использоваться
    Altered Таблица была изменена в ядре NDB, но все еще доступна для использования

    2.3.31.5. Object::Store

    Резюме

    Этот тип описывает постоянство Object.

    Описание. Чтение этой значения говорит нам, временный или постоянный объект.

    Возможные значения.

    Таблица 2.76.

    Имя Описание
    StoreUndefined Объект не определен
    StoreTemporary Временное хранение, объект или данные будут удалены при системном перезапуске
    StorePermanent Объект или данные постоянные, это было сохранено на диск

    2.3.31.6. Object::Type

    Резюме

    Этот тип описывает тип 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.

    2.3.31.7. Object::getObjectId()

    Описание. Этот метод получает ID объекта.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. ID объекта как integer.

    2.3.31.8. Object::getObjectStatus()

    Описание. Этот метод получает статус объекта, для которого это вызвано.

    Сигнатура.

    virtual Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Возвращает текущий Status для Object.

    2.3.31.9. Object::getObjectVersion()

    Описание. Метод получает текущую версию объекта.

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Номер версии объекта как integer.

    2.3.32. Структура OperationOptions

    Родительский класс. NdbOperation .

    Описание. Эти варианты передаются к основанному на NdbRecord первичному ключу и методам просмотра, определенным в классах NdbTransaction и NdbScanOperation.

    Большинство методов NdbTransaction::*Tuple() (см. раздел 2.3.30) берут дополнительный параметр sizeOfOptions . Это дополнительно и предназначается, чтобы разрешить интерфейсному внедрению оставаться обратно совместимым с не собранными повторно клиентами старшего возраста, которые могут передать более старую версию структуры OperationOptions. Этот эффект достигается, передавая sizeof(OperationOptions) в этот параметр.

    Каждый тип выбора отмечен как существующий, установив соответствующий бит в optionsPresent. Только типы выбора, отмеченные в optionsPresent, имеют разумные данные. Все данные копируются из структуры OperationOptions в операционное время определения. Если никакие варианты не требуются, то NULL может быть передан вместо этого.

    Члены.

    Таблица 2.78.

    Имя Тип Описание
    optionsPresent Uint64 Какие флаги присутствуют.
    [...] Flags:

    Принятые имена и значения показывают в следующем списке:

    • OO_ABORTOPTION: 0x01

    • OO_GETVALUE: 0x02

    • OO_SETVALUE: 0x04

    • OO_PARTITION_ID: 0x08

    • OO_INTERPRETED: 0x10

    • OO_ANYVALUE: 0x20

    • OO_CUSTOMDATA: 0x40

    • OO_LOCKHANDLE: 0x80

    • OO_QUEUABLE

      0x100

    • OO_NOT_QUEUABLE

      0x200

    • OO_DEFERRED_CONSTAINTS

      0x400

    • OO_DISABLE_FK

      0x800

    • OO_NOWAIT

      0x1000

    Тип флагов.
    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.

    2.3.33. Структура PartitionSpec

    Резюме

    Эта секция описывает структуру 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;
      };
    };
    

    2.3.34. Структура RecordSpecification

    Родительский класс. 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.

    2.3.35. Структура ScanOptions

    Родительский класс. NdbScanOperation.

    Описание. Эта структура данных используется, чтобы передать варианты к NdbRecord-методам scanTable() и scanIndex() класса NdbTransaction . Каждый тип выбора отмечен как существующий, установив соответствующий бит в поле optionsPresent. Только типы выбора, отмеченные в optionsPresent, обработаны.

    Все данные копируются из структуры ScanOptions в операционное время определения. Если никакие варианты не требуются, то NULL может быть передан как указатель ScanOptions.

    Члены.

    Таблица 2.84.

    Имя Тип Описание
    optionsPresent Uint64 Какие варианты присутствуют.
    [...] Type:
    • SO_SCANFLAGS: 0x01

    • SO_PARALLEL: 0x02

    • SO_BATCH: 0x04

    • SO_GETVALUE: 0x08

    • SO_PARTITION_ID: 0x10

    • SO_INTERPRETED: 0x20

    • SO_CUSTOMDATA: 0x40

    • SO_PARTINFO: 0x80

    Тип опций.
    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.

    2.3.36. Структура SetValueSpec

    Родительский класс. NdbOperation.

    Описание. Эта структура используется, чтобы определить дополнительное значение, чтобы установить как часть операции в NdbRecord .

    Члены.

    Таблица 2.85.

    Имя Тип Описание
    column Column Чтобы определить дополнительное значение, чтобы читать, вызывающий должен обеспечить это, а также указатель (возможно NULL) appStorage.
    value void* Это должно указать на значение, которое будет установлено, или NULL, если признак должен быть установлен в NULL. Ззначение копируется, когда операция определяется и не должно оставаться прежним во время выполнения.

    В настоящее время значения blob не могут быть установлены, используя SetValueSpec.

    См. раздел 2.3.27.

    2.3.37. Класс Table

    Резюме

    Эта секция описывает класс 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.

    2.3.37.1. Table::addColumn()

    Описание. Добавляет столбец к таблице.

    Сигнатура.

    void addColumn
    (
      const Column& column
    )
    

    Параметры. Ссылка на колонку, которая должна быть добавлена к таблице.

    Возвращаемое значение. Нет, но это действительно создает копию оригинального объекта Column.

    2.3.37.2. Table::aggregate()

    Описание. Этот метод вычисляет агрегированные данные для таблицы. Это требуется для таких совокупных методов, как getNoOfPrimaryKeys(), чтобы работать правильно перед тем, как таблица была составлена и получена через getTableId().

    Добавлено в MySQL 5.1.12 (Bug #21690).

    Сигнатура.

    int aggregate
    (
      struct NdbError& error
    )
    

    Параметры. Ссылка на объект NdbError.

    Возвращаемое значение. integer, значение которого 0 при успехе и -1, если таблица находится в непоследовательном статусе. В последнем случае также установлен error.

    2.3.37.3. Конструктор

    Описание. Создает экземпляр Table. Есть две версии конструктора, одна для создания нового экземпляра и вторая для конструктора копии.

    Таблицы, составленные в API NDB, используя этот метод, недоступны из MySQL.

    Сигнатура. Новый экземпляр:

    Table
    (
      const char* name = ""
    )
    

    Конструктор копии:

    Table
    (
      const Table& table
    )
    

    Параметры. Для нового экземпляра, название таблицы, которая будет создана. Для копии ссылки на таблицу, которая будет скопирована.

    Возвращаемое значение. Объект Table.

    Деструктор.

    virtual ~Table()
    

    2.3.37.4. Table::equal()

    Описание. Этот метод используется, чтобы сравнить один экземпляр Table с другим.

    Сигнатура.

    bool equal
    (
      const Table& table
    ) const
    

    Параметры. Ссылка на объект Table, с которым должен быть сравнен текущий экземпляр.

    Возвращаемое значение. true, если эти две таблицы одинаковы, иначе false.

    2.3.37.5. Table::getColumn()

    Описание. Этот метод используется, чтобы получить определение столбца, учитывая индекс или название колонки.

    Сигнатура. Этот метод может быть вызван, используя идентификатор или имя столбца, как показано здесь:

    Column* getColumn
    (
      const int AttributeId
    )
    
    Column* getColumn
    (
      const char* name
    )
    

    Параметры. Любой из: индекс колонки в таблице (когда это было бы возвращено методом колонки getColumnNo()) или название колонки.

    Возвращаемое значение. Указатель на колонку с указанным индексом или именем. Если нет такой колонки, то этот метод возвращает NULL.

    2.3.37.6. Table::getDefaultNoPartitionsFlag()

    Описание. Этот метод используется, чтобы узнать, используется ли номер разделения по умолчанию для таблицы.

    Сигнатура.

    Uint32 getDefaultNoPartitionsFlag
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. 32-bit unsigned integer.

    2.3.37.7. Table::getExtraMetadata()

    Описание. Получите и распакуйте дополнительные метаданные для этой 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.

    2.3.37.8. Table::getFragmentCount()

    Описание. Этот метод получает количество фрагментов в таблице.

    Сигнатура.

    Uint32 getFragmentCount
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество фрагментов таблицы как 32-bit unsigned integer.

    2.3.37.9. Table::getFragmentData()

    Описание. Этот метод получает данные о фрагменте таблицы (ID, состояние и узел).

    Сигнатура.

    const void* getFragmentData
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на данные, которые будут прочитаны.

    2.3.37.10. Table::getFragmentDataLen()

    Описание. Получает длину данных о фрагменте таблицы в байтах.

    Сигнатура.

    Uint32 getFragmentDataLen
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Число байтов, которые будут прочитаны как unsigned 32-bit integer.

    2.3.37.11. Table::getFragmentNodes()

    Описание. Этот метод получает список узлов, хранящих данный фрагмент.

    Сигнатура.

    Uint32 getFragmentNodes
    (
      Uint32 fragmentId,
      Uint32* nodeIdArrayPtr,
      Uint32 arraySize
    ) const
    

    Параметры.

    • fragmentId: ID желаемого фрагмента.

    • nodeIdArrayPtr: Указатель на множество ID узлов, содержащих этот фрагмент.

      Обычно основной фрагмент это запись 0 в этом множестве.

    • arraySize: Размер множества, содержащего ID узлов. Если это меньше, чем количество фрагментов, то только первые записи arraySize написаны в это множество.

    Возвращаемое значение. Возвращаемое значение 0 указывает на ошибку, иначе это количество фрагментов таблицы как 32-bit unsigned integer.

    2.3.37.12. Table::getFragmentType()

    Описание. Этот метод получает тип фрагментации таблицы.

    Сигнатура.

    FragmentType getFragmentType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение FragmentType как определено в разделе 2.3.31.1.

    2.3.37.13. Table::getFrmData()

    Описание. Данные из файла .FRM, связанного с таблицей.

    Сигнатура.

    const void* getFrmData
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на данные .FRM.

    2.3.37.14. Table::getFrmLength()

    Описание. Получает длину файла .FRM таблицы в байтах.

    Сигнатура.

    Uint32 getFrmLength
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Длина файла .FRM в байтах (unsigned 32-bit integer).

    2.3.37.15. Table::getHashMap()

    Описание. Получает используемую хэш-карту для этой таблицы. Введено в NDB 7.2.7.

    Сигнатура.

    bool getHashMap
    (
      Uint32* id = 0,
      Uint32* version = 0
    ) const
    

    Параметры. ID и версия таблицы.

    Возвращаемое значение. True, если у таблицы есть хэш-карта, иначе false.

    2.3.37.16. Table::getKValue()

    Описание. Этот метод получает KValue, параметр хеширования, который в настоящее время ограничивается значением 6. В будущем выпуске может стать выполнимо установить этот параметр на другие значения.

    Сигнатура.

    int getKValue
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer (сейчас всегда 6).

    2.3.37.17. Table::getLinearFlag()

    Описание. Этот метод получает значение линейного флага хеширования таблицы.

    Сигнатура.

    bool getLinearFlag
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если флаг установлен, false, если нет.

    2.3.37.18. Table::getLogging()

    Описание. Этот класс используется, чтобы проверить, зарегистрирована ли таблица на диске, то есть, постоянная она или временная.

    Сигнатура.

    bool getLogging
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Если true, тогда таблица полностью сохранена на диск. Если false, таблица временная и не зарегистрирована на диске, в случае системного перезапуска таблица все еще существует и сохраняет свое определение, но будет пустой. Значение регистрации по умолчанию true.

    2.3.37.19. Table::getMaxLoadFactor()

    Описание. Этот метод возвращает коэффициент загрузки (параметр хеширования), когда начинается разделение контейнеров в местных хэш-таблицах.

    Сигнатура.

    int getMaxLoadFactor
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer, максимальное значение которого равняется 100. Когда максимальное значение возвращено, это означает, что использование памяти оптимизировано. Меньшие значения указывают, что меньше данных хранится в каждом контейнере, что означает, что ключи найдены более быстро, однако, это также потребляет больше памяти.

    2.3.37.20. Table::getMaxRows()

    Описание. Этот метод получает максимальное количество строк, которые может вместить таблица. Это используется для вычисления количества разделения.

    Сигнатура.

    Uint64 getMaxRows
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Максимальное количество строк таблицы как 64-bit unsigned integer.

    2.3.37.21. Table::getMinLoadFactor()

    Описание. Этот метод получает значение коэффициента загрузки, когда сокращение хэш-таблицы начинается. Это должно всегда быть меньше, чем значение, возвращенное getMaxLoadFactor().

    Сигнатура.

    int getMinLoadFactor
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer (на самом деле процент, выраженный как целое число, посмотрите раздел 2.3.37.19).

    2.3.37.22. Table:getName()

    Описание. Получает название таблицы.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название таблицы (последовательность).

    2.3.37.23. Table::getNoOfColumns()

    Описание. Этот метод используется, чтобы получить количество столбцов в таблице.

    Сигнатура.

    int getNoOfColumns
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer, представляющий количество столбцов в таблице.

    2.3.37.24. Table::getNoOfPrimaryKeys()

    Описание. Этот метод находит количество столбцов первичного ключа в таблице.

    Сигнатура.

    int getNoOfPrimaryKeys
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer, представляющий количество столбцов первичного ключа в таблице.

    2.3.37.25. Table::getObjectId()

    Описание. Этот метод получает идентификатор объекта таблицы.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта возвращен как integer.

    2.3.37.26. Table::getObjectStatus()

    Описание. Этот метод получает статус таблицы, то есть, Object::Status.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. A Status. См. раздел 2.3.31.4.

    2.3.37.27. Table::getObjectType()

    Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

    Сигнатура.

    Object::Type getObjectType
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение Type. См. раздел 2.3.31.6.

    2.3.37.28. Table::getObjectVersion()

    Описание. Этот метод получает версию объекта таблицы (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта таблицы как integer.

    2.3.37.29. Table::getPartitionBalance()

    Описание. Этот метод получает схему баланса разделения (тип количества фрагментов).

    Сигнатура.

    Object::PartitionBalance getPartitionBalance
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Схема балансирования разделения как значение типа Object::PartitionBalance.

    До NDB 7.5.4 этот метод был известен как getFragmentCountType().

    2.3.37.30. Table::getPartitionBalanceString()

    Описание. Этот метод получает схему баланса разделения (тип количества фрагментов) и возвращает его как последовательность.

    Сигнатура.

    const char* getPartitionBalanceString
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Схема балансирования разделения, как значение последовательности.

    До NDB 7.5.4 этот метод был известен как getFragmentCountTypeString().

    2.3.37.31. Table::getPartitionId()

    Описание. Получает ID разделения таблицы, данный его значением хэш-функции.

    Сигнатура.

    Uint32 getPartitionId
    (
      Uint32 hashvalue
    ) const
    

    Параметры. hashvalue. Отметьте, что если таблица не была на самом деле получена (например, через getTableId()), результат, вероятно, не будет точным или полезным.

    Возвращаемое значение. Идентификатор разделения, соответствующего hashvalue.

    2.3.37.32. Table::getPrimaryKey()

    Описание. Этот метод используется, чтобы получить название первичного ключа таблицы.

    Сигнатура.

    const char* getPrimaryKey
    (
      int no
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название первичного ключа, последовательность (указатель на символ).

    2.3.37.33. Table::getRangeListData()

    Описание. Этот метод получает диапазон или данные о списке, связанные с таблицей.

    Сигнатура.

    const void* getRangeListData
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на данные.

    2.3.37.34. Table::getRangeListDataLen()

    Описание. Этот метод получает размер диапазона таблицы или множества списка.

    Сигнатура.

    Uint32 getRangeListDataLen
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Длина списка или множества диапазона как integer.

    2.3.37.35. Table::getRowChecksumIndicator()

    Описание. Проверка, был ли индикатор контрольной суммы строки установлен.

    Сигнатура.

    bool getRowChecksumIndicator
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true или false.

    2.3.37.36. Table::getRowGCIIndicator()

    Описание. Проверка, был ли индикатор GCI строки установлен.

    Сигнатура.

    bool getRowGCIIndicator
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true or false.

    2.3.37.37. Table::getSingleUserMode()

    Описание. Получает однопользовательский режим таблицы.

    Сигнатура.

    enum SingleUserMode getSingleUserMode
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. SingleUserMode.

    2.3.37.38. Table::getTableId()

    Описание. Этот метод получает ID таблицы.

    Сигнатура.

    int getTableId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. integer.

    2.3.37.39. Table::getTablespace()

    Описание. Этот метод используется двумя способами: чтобы получить название табличного пространства, на которое назначена эта таблица, и чтобы проверить, что данное табличное пространство это то, которое используется этой таблицей.

    Сигнатуры. Чтобы получить название табличного пространства, вызовите без любых аргументов:

    const char* getTablespace
    (
      void
    ) const
    

    Чтобы определить, является ли табличное пространство тем, которое обозначено данным ID и версией, поставляйте их как аргументы, как показано здесь:

    bool getTablespace
    (
      Uint32* id= 0,
      Uint32* version = 0
    ) const
    

    Параметры. Число и типы параметров зависят от того, как этот метод используется:

    1. Когда используется, чтобы получить название табличного пространства в использовании таблицей, это вызывают без любых аргументов.

    2. Когда используется, чтобы определить, является ли данное табличное пространство используемым этой таблицей, тогда getTablespace() берет два параметра:

      • Табличное пространство id как указатель на 32-bit unsigned integer.

      • Табличное пространство version как указатель на 32-bit unsigned integer.

      Значение по умолчанию для обоих id и version это 0.

    Возвращаемое значение. Тип возвращения зависит от того, как метод вызывают.

    1. Когда getTablespace() вызван без любых аргументов, это возвращает экземпляр объекта Tablespace .

    2. Когда вызвано с двумя аргументами, это возвращает true, если табличное пространство совпадает с имеющим заданный ID и обозначенную версию, иначе это возвращает false.

    2.3.37.40. Table::getTablespaceData()

    Описание. Этот метод получает данные о табличном пространстве таблицы (ID и версия).

    Сигнатура.

    const void* getTablespaceData
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Указатель на данные.

    2.3.37.41. Table::getTablespaceDataLen()

    Описание. Этот метод используется, чтобы получить длину данных о табличном пространстве таблицы.

    Сигнатура.

    Uint32 getTablespaceDataLen
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Длина данных как 32-bit unsigned integer.

    2.3.37.42. Table::getTablespaceNames()

    Описание. Этот метод получает указатель на названия табличных пространств, используемых во фрагментах таблицы.

    Сигнатура.

    const void* getTablespaceNames
    (
      void
    )
    

    Параметры. Нет.

    Возвращаемое значение. Возвращает указатель на данные об имени табличного пространства.

    2.3.37.43. Table::getTablespaceNamesLen()

    Описание. Этот метод получает длину данных об имени табличного пространства, возвращенных getTablespaceNames(). См. раздел 2.3.37.42.

    Сигнатура.

    Uint32 getTablespaceNamesLen
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Возвращает длину данных об имени в байтах как 32-бит unsigned integer.

    2.3.37.44. Table::hasDefaultValues()

    Описание. Используется, чтобы определить, есть ли у таблицы какие-либо колонки, которые определяются с не-NULL по умолчанию.

    Чтобы прочитать и написать значения столбцов по умолчанию, надо использовать Column::getDefaultValue() и Column::setDefaultValue().

    Сигнатура.

    bool hasDefaultValues
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. true, если у таблицы есть какие-либо не-NULL колонки со значениями по умолчанию, иначе false.

    2.3.37.45. Table::setDefaultNoPartitionsFlag()

    Описание. Этот метод устанавливает индикатор, который определяет, используется ли номер разделения по умолчанию для таблицы.

    Сигнатура.

    void setDefaultNoPartitionsFlag
    (
      Uint32 indicator
    ) const
    

    Параметры. Этот метод берет отдельный аргумент indicator, 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.46. Table::setExtraMetadata()

    Описание. Сохраните упакованные дополнительные метаданные для этой таблицы. Данные упакованы без любой модификации в буфер данного объекта Table.

    Сигнатура.

    int setExtraMetadata
    (
      Uint32 version,
      const void* data,
      Uint32 length
    )
    

    Параметры.

    • version: Как используется в коде NDB Cluster, 1 значит, что дополнительные метаданные содержат файл .frm (BLOB) как в NDB 7.6 и ранее, 2 значит, что это преобразованная в последовательную форму информация о словаре как в NDB 8.0. Необходимо знать, что это просто соглашение, и значения могут быть специализированы, как надо.

    • data: Фактические данные, которые будут сохранены как метаданные.

    • length: Длина данных, которые будут сохранены.

    Возвращаемое значение. 0 при успехе. Любое другое значение указывает на неудачу, в этом случае значение это код ошибки, указывающее на тип ошибки.

    Добавлено в NDB 8.0.13.

    2.3.37.47. Table::setFragmentCount()

    Описание. Определяет число фрагментов таблицы.

    Сигнатура.

    void setFragmentCount
    (
      Uint32 count
    )
    

    Параметры. count количество фрагментов, которые будут использоваться для таблицы.

    Возвращаемое значение. Нет.

    2.3.37.48. Table::setFragmentData()

    Описание. Этот метод пишет множество, содержащее следующую информацию о фрагменте:

    • Fragment ID

    • Node group ID

    • Fragment State

    Сигнатура.

    void setFragmentData
    (
      const void* data,
      Uint32 len
    )
    

    Параметры.

    • Указатель на фрагмент data для записи.

    • Длина (len) этих данных в байтах как 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.49. Table::setFragmentType()

    Описание. Этот метод устанавливает тип фрагментации таблицы.

    Сигнатура.

    void setFragmentType
    (
      FragmentType fragmentType
    )
    

    Параметры. Этот метод берет один аргумент, значение FragmentType, см. раздел 2.3.31.1.

    Возвращаемое значение. Нет.

    2.3.37.50. Table::setFrm()

    Описание. Этот метод используется, чтобы написать данные файла .FRM этой таблицы.

    Сигнатура.

    void setFrm
    (
      const void* data,
      Uint32 len
    )
    

    Параметры.

    • Указатель на data для записи.

    • Длина (len) данных.

    Возвращаемое значение. Нет.

    2.3.37.51. Table::setHashMap()

    Описание. Установите хэш-карту для таблицы. Введено в NDB 7.2.7.

    Сигнатура.

    int setHashMap
    (
      const class HashMap &
    )
    

    Параметры. Ссылка на хэш-карту.

    Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.

    2.3.37.52. Table::setKValue()

    Описание. Это устанавливает параметр хеширования KValue.

    Сигнатура.

    void setKValue
    (
      int kValue
    )
    

    Параметры. kValue это integer. В настоящее время единственное разрешенное значение 6. В будущей версии это может стать переменным параметром.

    Возвращаемое значение. Нет.

    2.3.37.53. Table::setLinearFlag()

    Сигнатура.

    void setLinearFlag
    (
      Uint32 flag
    )
    

    Параметры. flag это 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.54. Table::setLogging()

    Описание. Переключает состояние регистрации таблицы. Посмотрите раздел 2.3.37.18.

    Сигнатура.

    void setLogging
    (
      bool enable
    )
    

    Параметры. Если enable = true, тогда регистрация для этой таблицы позволена, если это false, она выключена.

    Возвращаемое значение. Нет.

    2.3.37.55. Table::setMaxLoadFactor()

    Описание. Этот метод устанавливает фактор максимальной нагрузки, разделяя контейнеры в местных хэш-таблицах.

    Сигнатура.

    void setMaxLoadFactor
    (
      int max
    )
    

    Параметры. Этот метод берет единственный параметр max, integer, представляющий процент (например, 45 задает 45%). См. раздел 2.3.37.19.

    Это никогда не должно быть больше, чем минимальный коэффициент загрузки.

    Возвращаемое значение. Нет.

    2.3.37.56. Table::setMaxRows()

    Описание. Этот метод определяет максимальное число строк, которые могут быть обработаны таблицей.

    Сигнатура.

    void setMaxRows
    (
      Uint64 maxRows
    )
    

    Параметры. maxRows это 64-bit unsigned integer, который представляет максимальное количество строк, которые будут храниться в таблице.

    Возвращаемое значение. Нет.

    2.3.37.57. Table::setMinLoadFactor()

    Описание. Этот метод устанавливает минимальный коэффициент загрузки, когда сокращение хэш-таблицы начинается.

    Сигнатура.

    void setMinLoadFactor
    (
      int min
    )
    

    Параметры. Этот метод берет единственный параметр min, integer, задающий процент (например, 45 значит 45%). См. раздел 2.3.37.21.

    Возвращаемое значение. Нет.

    2.3.37.58. Table::setName()

    Описание. Этот метод определяет имя таблицы.

    Это единственный метод set*() Table, чьи эффекты видимы MySQL.

    Сигнатура.

    void setName
    (
      const char* name
    )
    

    Параметры. name новое название таблицы.

    Возвращаемое значение. Нет.

    2.3.37.59. Table::setObjectType()

    Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

    Сигнатура.

    void setObjectType
    (
      Object::Type type
    )
    

    Параметры. Требуемый объект type . Это должно быть одним из значений Type , перечисленных в раздел 2.3.31.6 .

    Возвращаемое значение. Нет.

    2.3.37.60. Table::setPartitionBalance()

    Описание. Устанавливает схему балансирования разделения таблицы.

    Сигнатура.

    void setPartitionBalance
    (
      Object::PartitionBalance scheme
    )
    

    Параметры. scheme это схема балансирования разделения, которая будет использоваться для таблицы. Это значение типа PartitionBalance.

    Возвращаемое значение. Нет.

    До NDB 7.5.4 этот метод был известен как setFragmentCountType().

    2.3.37.61. Table::setRangeListData()

    Описание. Этот метод устанавливает множество, содержащее информацию, которая отображает значения диапазона и список значений к фрагментам. Это по существу сортированная карта, состоящая из пар fragment-ID/value. Для разделения диапазона есть одна пара на фрагмент. Для разделения списка это могло быть любое число пар, но по крайней мере столько же пар, сколько есть фрагментов.

    Сигнатура.

    void setRangeListData
    (
      const void* data,
      Uint32 len
    )
    

    Параметры.

    • Указатель на диапазон или список data, содержащий пары ID/значения.

    • Длина (len) этих данных как 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.62. Table::setRowChecksumIndicator()

    Описание. Установить индикатор контрольной суммы строки.

    Сигнатура.

    void setRowChecksumIndicator
    (
      bool value
    ) const
    

    Параметры. true/false value.

    Возвращаемое значение. Нет.

    2.3.37.63. Table::setRowGCIIndicator()

    Описание. Устанавливает индикатор GCI строки.

    Сигнатура.

    void setRowGCIIndicator
    (
      bool value
    ) const
    

    Параметры. true/false value.

    Возвращаемое значение. Нет.

    2.3.37.64. Table::setSingleUserMode()

    Описание. Задает для таблицы SingleUserMode.

    Сигнатура.

    void setSingleUserMode
    (
      enum SingleUserMode
    )
    

    Параметры. Знаяение SingleUserMode.

    Возвращаемое значение. Нет.

    2.3.37.65. Table::setStatusInvalid()

    Описание. Вынуждает статус таблицы быть лишенным законной силы.

    Сигнатура.

    void setStatusInvalid
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Нет.

    2.3.37.66. Table::setTablespace()

    Описание. Этот метод устанавливает табличное пространство для таблицы.

    Сигнатуры. Используя название табличного пространства:

    void setTablespace
    (
      const char* name
    )
    

    Используя объект Tablespace:

    void setTablespace
    (
      const class Tablespace& tablespace
    )
    

    Параметры. Этот метод можно вызвать с отдельным аргументом, который может иметь любой из этих двух типов:

    1. Имя name табличного пространства (последовательность).

    2. Ссылка на существующий экземпляр Tablespace .

    См. раздел 2.3.38.

    Возвращаемое значение. Нет.

    2.3.37.67. Table::setTablespaceData()

    Описание. Этот метод устанавливает информацию о табличном пространстве для каждого фрагмента и включает ID и версию табличного пространства.

    Сигнатура.

    void setTablespaceData
    (
      const void* data,
      Uint32 len
    )
    

    Параметры.

    • Указатель на data, содержащие ID и версию табличного пространства

    • Длина (len) этих данных как 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.68. Table::setTablespaceNames()

    Описание. Определяет имена табличных пространств, используемых фрагментами таблицы.

    Сигнатура.

    void setTablespaceNames
    (
      const void* data
      Uint32 len
    )
    

    Параметры.

    • Указатель на имена табличных пространств data

    • Длина (len) данных об именах как 32-bit unsigned integer.

    Возвращаемое значение. Нет.

    2.3.37.69. Table::SingleUserMode

    Описание. Однопользовательский режим определяет права доступа к таблице.

    Возможные значения.

    Таблица 2.87.

    Имя Описание
    SingleUserModeLocked Таблица блокирована (недоступна).
    SingleUserModeReadOnly Таблица доступна в режиме только для чтения.
    SingleUserModeReadWrite Таблица доступна в режиме чтения и записи.

    2.3.37.70. Table::validate()

    Описание. Этот метод утверждает определение для новой таблицы до того, как это создано и выполняет метод Table::aggregate(), а также дополнительные проверки. validate() вызван автоматически, когда таблица составлена или получена. Поэтому обычно не надо явно вызывать aggregate() или validate().

    Даже после вызова validate() там могут все еще существовать ошибки, которые могут быть обнаружены только ядром NDB, когда таблица на самом деле составлена.

    Добавлено в MySQL 5.1.12 (Bug #21690).

    Сигнатура.

    int validate
    (
      struct NdbError& error
    )
    

    Параметры. Ссылка на объект NdbError.

    Возвращаемое значение. integer, значение которого 0 при успехе, -1, если таблица находится в непоследовательном статусе. В последнем случае также установлен error.

    2.3.38. Класс Tablespace

    Резюме

    Эта секция обсуждает класс 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.

    2.3.38.1. Конструктор Tablespace

    Описание. Эти методы используются, чтобы создать новый экземпляр Tablespace или скопировать существующий.

    Класс Dictionary также поставляет методы для создания и удаления табличных пространств.

    Сигнатуры. Новый экземпляр:

    Tablespace
    (
      void
    )
    

    Конструктор копии:

    Tablespace
    (
      const Tablespace& tablespace
    )
    

    Параметры. Новый экземпляр: Нет. Конструктор копии: ссылка на существующий экземпляр Tablespace.

    Возвращаемое значение. Объект Tablespace.

    Деструктор. Класс определяет виртуальный деструктор ~Tablespace(), который не берет аргументов и не возвращает значения.

    2.3.38.2. Tablespace::getAutoGrowSpecification()

    Сигнатура.

    const AutoGrowSpecification& getAutoGrowSpecification
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Ссылка на структуру, которая описывает табличное пространство, см. раздел 2.3.1.

    2.3.38.3. Tablespace::getDefaultLogfileGroup()

    Описание. Этот метод получает имя группы файла журнала табличного пространства по умолчанию.

    Альтернативно, можно хотеть получить ID группы файла журнала по умолчанию, посмотрите раздел 2.3.38.4.

    Сигнатура.

    const char* getDefaultLogfileGroup
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя группы файла журнала (указатель на символ).

    2.3.38.4. Tablespace::getDefaultLogfileGroupId()

    Описание. Этот метод получает ID группы файла журнала табличного пространства по умолчанию.

    Можно также получить непосредственно имя группы файла журнала по умолчанию, а не ее ID, посмотрите раздел 2.3.38.3.

    Сигнатура.

    Uint32 getDefaultLogfileGroupId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. ID группы файла журнала как unsigned 32-bit integer.

    2.3.38.5. Tablespace::getExtentSize()

    Описание. Этот метод используется, чтобы получить extent size, который является размером единиц выделения памяти, используемый табличным пространством.

    Тот же самый размер используется для всех файлов данных, содержащихся в данном табличном пространстве.

    Сигнатура.

    Uint32 getExtentSize
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Размер экстента табличного пространства в байтах как unsigned 32-bit integer.

    2.3.38.6. Tablespace::getObjectId()

    Описание. Этот метод получает идентификатор объекта табличного пространства.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта как integer.

    2.3.38.7. Tablespace::getName()

    Описание. Этот метод получает название табличного пространства.

    Сигнатура.

    const char* getName
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Название табличного пространства, значение последовательности (как указатель на символ).

    2.3.38.8. Tablespace::getObjectStatus()

    Описание. Этот метод используется, чтобы получить статус объекта табличного пространства.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение Object::Status.

    2.3.38.9. Tablespace::getObjectVersion()

    Описание. Этот метод получает версию объекта табличного пространства (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта как integer.

    2.3.38.10. Tablespace::setAutoGrowSpecification()

    Описание. Этот метод используется, чтобы установить особенности табличного пространства.

    Сигнатура.

    void setAutoGrowSpecification
    (
      const AutoGrowSpecification& autoGrowSpec
    )
    

    Параметры. Этот метод берет единственный параметр, структуру данных AutoGrowSpecification.

    Возвращаемое значение. Нет.

    2.3.38.11. Tablespace::setDefaultLogfileGroup()

    Описание. Этот метод используется, чтобы установить группу файла журнала табличного пространства по умолчанию.

    Сигнатура. Этот метод можно назвать двумя различными способами. Первый использует имя группы файла журнала, как показано здесь:

    void setDefaultLogfileGroup
    (
      const char* name
    )
    

    Этот метод можно также вызвать, передав ему ссылку на объект LogfileGroup:

    void setDefaultLogfileGroup
    (
      const class LogfileGroup& lGroup
    )
    

    Нет никакого метода для установки группы файла журнала как умолчание для табличного пространства, ссылаясь на ID группы файла журнала. Другими словами, нет метода set*() , соответствующего getDefaultLogfileGroupId() .

    Параметры. name группы файла журнала, которая будет назначена на табличное пространство или ссылка lGroup на группу файла журнала.

    Возвращаемое значение. Нет.

    2.3.38.12. Tablespace::setExtentSize()

    Описание. Этот метод устанавливает размер экстента табличного пространства.

    Сигнатура.

    void setExtentSize
    (
      Uint32 size
    )
    

    Параметры. size для экстентов этого табличного пространства в байтах.

    Возвращаемое значение. Нет.

    2.3.38.13. Tablespace::setName()

    Описание. Этот метод определяет имя табличного пространства.

    Сигнатура.

    void setName
    (
      const char* name
    ) const
    

    Параметры. Имя name табличного пространства, последовательность (указатель на символ).

    Возвращаемое значение. Нет.

    2.3.39. Класс undofile

    Резюме

    Секция обсуждает класс 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 не определяет публичных типов.

    2.3.39.1. Конструктор undofile

    Описание. Конструктор класса может использоваться, чтобы создать новый экземпляр undofile или скопировать существующий.

    Сигнатуры. Создает новый экземпляр:

    undofile
    (
      void
    )
    

    Конструктор копии:

    undofile
    (
      const undofile& undofile
    )
    

    Параметры. Новый экземпляр: Нет . Конструктор копии: берет отдельный аргумент, ссылку на копируемый undofile.

    Возвращаемое значение. Объект undofile.

    Деструктор. Класс определяет виртуальный деструктор, который не берет аргументов и имеет тип возвращения void.

    2.3.39.2. undofile::getFileNo()

    Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

    Сигнатура.

    Uint32 getFileNo
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Количество файлов отмен как unsigned 32-bit integer.

    2.3.39.3. undofile::getLogfileGroup()

    Описание. Этот метод получает имя группы файла журнала, которой принадлежит файл отмен.

    Сигнатура.

    const char* getLogfileGroup
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Имя группы файла журнала, значение последовательности (как указатель на символ).

    2.3.39.4. undofile::getLogfileGroupId()

    Описание. Этот метод получает ID группы файла журнала, которой принадлежит файл отмен.

    Также возможно получить имя группы файла журнала непосредственно. Посмотрите раздел 2.3.39.3

    Сигнатура.

    Uint32 getLogfileGroupId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. ID группы файла журнала как unsigned 32-bit integer.

    2.3.39.5. undofile::getNode()

    Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

    Сигнатура.

    Uint32 getNode
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. ID узла как unsigned 32-bit integer.

    2.3.39.6. undofile::getObjectId()

    Описание. Этот метод получает идентификатор объекта файла отмен.

    Сигнатура.

    virtual int getObjectId
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Идентификатор объекта как integer.

    2.3.39.7. undofile::getObjectStatus()

    Описание. Этот метод используется, чтобы получить статус объекта файла отмен.

    Сигнатура.

    virtual Object::Status getObjectStatus
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Значение Object::Status.

    2.3.39.8. undofile::getObjectVersion()

    Описание. Этот метод получает версию объекта файла отмен (см. NDB Schema Object Versions).

    Сигнатура.

    virtual int getObjectVersion
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Версия объекта как integer.

    2.3.39.9. undofile::getPath()

    Описание. Этот метод получает путь, соответствующий местоположению файла отмен в файловой системе узла данных.

    Сигнатура.

    const char* getPath
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Путь файловой системы (как указатель на символ).

    2.3.39.10. undofile::getSize()

    Описание. Этот метод получает размер файла отмен в байтах.

    Сигнатура.

    Uint64 getSize
    (
      void
    ) const
    

    Параметры. Нет.

    Возвращаемое значение. Размер в байтах файла отмен как unsigned 64-bit integer.

    2.3.39.11. undofile::setLogfileGroup()

    Описание. Учитывая имя или ссылку на объект группы файла журнала метод setLogfileGroup() назначает файл отмен на эту группу файла журнала.

    Сигнатура. Используя название группы файла журнала:

    void setLogfileGroup
    (
      const char* name
    )
    

    Используя ссылку на экземпляр LogfileGroup:

    void setLogfileGroup
    (
      const class LogfileGroup & logfileGroup
    )
    

    Параметры. Имя name группы файла журнала (указатель на символ) или ссылка на экземпляр LogfileGroup.

    Возвращаемое значение. Нет.

    2.3.39.12. undofile::setNode()

    Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).

    Сигнатура.

    void setNode
    (
      Uint32 nodeId
    )
    

    Параметры. nodeId узла данных, куда файл отмен должен быть помещен, unsigned 32-bit integer.

    Возвращаемое значение. Нет.

    2.3.39.13. undofile::setPath()

    Описание. Этот метод используется, чтобы установить путь файловой системы файла отмен на узле данных, где это находится.

    Сигнатура.

    void setPath
    (
      const char* path
    )
    

    Параметры. Желаемый путь path к файлу отмен.

    Возвращаемое значение. Нет.

    2.3.39.14. undofile::setSize()

    Описание. Устанавливает размер файла отмен в байтах.

    Сигнатура.

    void setSize
    (
    Uint64 size
    )
    

    Параметры. Намеченный размер size файла отмен в байтах, unsigned 64-bit integer.

    Возвращаемое значение. Нет.

    2.4. Ошибки NDB API и обработка ошибок

    Резюме

    Эта секция содержит обсуждение обработки ошибок в приложениях NDB API а также списки листингов наиболее распространенных кодов ошибок и сообщений NDB с их классификациями и вероятными причинами, для которого они могли бы быть подняты.

    Для получения информации о структуре NdbError, которая используется, чтобы передать информацию об ошибке приложениям API NDB, см. раздел 2.3.20.

    Сильно рекомендуется, чтобы вы НЕ зависели от определенных кодов ошибок в вашем приложении NDB API, поскольку они подвержены изменениям со временем. Вместо этого необходимо использовать NdbError::Status и классификация ошибок в вашем исходном коде или работать с выводом perror --ndb error_code, чтобы получить информацию об определенном коде ошибки.

    Если вы находите ситуацию, в которой необходимо использовать определенный код ошибки, пожалуйста, подайте отчет об ошибках на http://bugs.mysql.com/, чтобы мы могли обновить соответствующий статус и классификацию.

    2.4.1. Обработка ошибки NDB API

    Резюме

    Эта секция описывает, как ошибки 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()

    Резюме. В целом для ошибки возможно произойти во время выполнения (приводя к коду возврата неудачи), вызывая любой из следующих методов:

    Если это происходит, метод 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 handling value1 ...
      case value2:
      //statement block handling value2 ...
      //(etc. ...)
      case valueN:
      //statement block handling valueN ...
    }
    

    Так как транзакция была прервана, вообще необходимо пройти по законченным операциям (если таковые имеются) и учесть ошибки, поднятые каждой операцией, только если вы хотите сделать так для сообщения о причинах.

    } 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 handling value1 ...
      case value2:
      //statement block handling value2 ...
      //(etc. ...)
      case valueN:
      //statement block handling valueN ...
      }
    }
    

    Для получения информации об ошибочных классификационных кодах API NDB и кодах статусов посмотрите раздел 2.4.4. В то время как вы не должны полагаться на определенный код ошибки или текст сообщения в ваших приложениях API NDB, коды ошибок и сообщения подлежат изменению со временем, может быть полезно проверить коды ошибок и сообщения, чтобы помочь определить, почему произошла конкретная неудача. Для получения дополнительной информации о них, посмотрите раздел 2.4.2. Для подробностей о NdbError и типах информации, которая может быть получена из объектов NdbError см. раздел 2.3.20.

    2.4.2. Коды ошибок NDB: типы

    Эта секция содержит много списков кодов ошибок, один для каждого типа ошибки API NDB. Ошибочные типы включают следующее:

    • Нет ошибки

    • Ошибка приложения

    • Ошибка приложения просмотра

    • Конфигурация или ошибка приложения

    • Никакие данные не найдены

    • Ограничительное нарушение

    • Ошибка схемы

    • Пользователь определил ошибку

    • Недостаточно места

    • Временная ошибка ресурса

    • Ошибка восстановления узла

    • Ошибка перегрузки

    • Тайм-аут кончился

    • Закрытие узла

    • Внутренний временный сбой

    • Неизвестная ошибка результата

    • Неизвестный (в настоящее время неиспользованный) код ошибки

    • Внутренняя ошибка

    • Функция не реализована

    Информация в каждом списке включает для каждой ошибки:

    • Код ошибки NDB

    • Соответствующий код ошибки MySQL

    • Классификационный код NDB

      См. раздел 2.4.4 для значений этих классификационных кодов.

    • Текст сообщения об ошибке

    Подобные ошибки сгруппированы в каждом списке. Каждый список упорядочен в алфавитном порядке.

    Можно всегда получать последние коды ошибок и информацию от файла storage/ndb/src/ndbapi/ndberror.cpp. (в предыдущих выпусках NDB Cluster этот файл был ndberror.c).

    Эти типы также показывают в столбце error_status таблицы ndbinfo.error_messages.

    2.4.2.1. Нет ошибки

    0

    Ошибка MySQL. 0

    Сообщение об ошибке. No error

    2.4.2.2. Ошибка приложения

    1233

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table read-only

    1302

    Ошибка MySQL. DMEC

    Сообщение об ошибке. A backup is already running

    1306

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup not supported in diskless mode (change Diskless)

    1329

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup during software upgrade not supported

    1342

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to allocate buffers (check configuration)

    1343

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to setup fs buffers (check configuration)

    1344

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to allocate tables (check configuration)

    1345

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to insert file header (check configuration)

    1346

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to insert table list (check configuration)

    1347

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to allocate table memory (check configuration)

    1348

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to allocate file record (check configuration)

    1349

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed to allocate attribute record (check configuration)

    1701

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node already reserved

    1702

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node already connected

    1704

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node type mismatch

    21000

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Сообщение об ошибке. Create foreign key failed - parent key is primary key and on-update-cascade is not allowed

    21026

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Сообщение об ошибке. Create foreign key failed in NDB - parent index is not unique index

    21033

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Сообщение об ошибке. Create foreign key failed in NDB - No parent row found

    21034

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Сообщение об ошибке. Create foreign key failed - child table has Blob or Text column and on-delete-cascade is not allowed

    21040

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found

    21060

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Build foreign key failed in NDB - foreign key not found

    21080

    Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED

    Сообщение об ошибке. Drop table not allowed in NDB - referenced by foreign key on another table

    21081

    Ошибка MySQL. HA_ERR_DROP_INDEX_FK

    Сообщение об ошибке. Drop index not allowed in NDB - used as parent index of a foreign key

    21082

    Ошибка MySQL. HA_ERR_DROP_INDEX_FK

    Сообщение об ошибке. Drop index not allowed in NDB - used as child index of a foreign key

    21090

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Сообщение об ошибке. Create foreign key failed in NDB - name contains invalid character (/)

    242

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Zero concurrency in scan

    244

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too high concurrency in scan

    261

    Ошибка MySQL. DMEC

    Сообщение об ошибке. DML count in transaction exceeds config parameter MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations

    269

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No condition and attributes to read in scan

    281

    Ошибка MySQL. HA_ERR_NO_CONNECTION

    Сообщение об ошибке. Operation not allowed due to cluster shutdown in progress

    299

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Operation not allowed or aborted due to single user mode

    311

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Undefined partition used in setPartitionId

    320

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid no of nodes specified for new nodegroup

    321

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid nodegroup id

    322

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node already in nodegroup

    323

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid nodegroup id, nodegroup already existing

    324

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, no node in nodegroup is started

    325

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node ID invalid or undefined

    4004

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attribute name or id not found in the table

    4100

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Status Error in NDB

    4101

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No connections to NDB available and connect failed

    4102

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Type in NdbTamper not correct

    4103

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No schema connections to NDB available and connect failed

    4104

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Ndb Init in wrong state, destroy Ndb object and create a new

    4105

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many Ndb objects

    4106

    Ошибка MySQL. DMEC

    Сообщение об ошибке. All Not NULL attribute have not been defined

    4114

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction is already completed

    4116

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Operation was not defined correctly, probably missing a key

    4117

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Could not start transporter, configuration error

    4118

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Parameter error in API call

    4120

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Scan already complete

    4121

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot set name twice for an Ndb object

    4122

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot set name after Ndb object is initialised

    4123

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Free percent out of range. Allowed range is 1-99

    417

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad operation reference - double unlock

    4200

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Status Error when defining an operation

    4201

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Variable Arrays not yet supported

    4202

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Set value on tuple key attribute is not allowed

    4203

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL

    4204

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Set value and Read/Delete Tuple is incompatible

    4205

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No Key attribute used to define tuple

    4206

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not allowed to equal key attribute twice

    4207

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Key size is limited to 4092 bytes

    4208

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trying to read a non-stored attribute

    4209

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Length parameter in equal/setValue is incorrect

    4210

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Ndb sent more info than the length he specified

    4211

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistency in list of NdbRecAttr-objects

    4212

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Ndb reports NULL value on Not NULL attribute

    4213

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not all data of an attribute has been received

    4214

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not all attributes have been received

    4215

    Ошибка MySQL. DMEC

    Сообщение об ошибке. More data received than reported in TCKEYCONF message

    4216

    Ошибка MySQL. DMEC

    Сообщение об ошибке. More than 8052 bytes in setValue cannot be handled

    4217

    Ошибка MySQL. DMEC

    Сообщение об ошибке. It is not allowed to increment any other than unsigned ints

    4218

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Currently not allowed to increment NULL-able attributes

    4219

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits

    4220

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits

    4221

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trying to jump to a non-defined label

    4222

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Label was not found, internal error

    4223

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not allowed to create jumps to yourself

    4224

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not allowed to jump to a label in a different subroutine

    4225

    Ошибка MySQL. DMEC

    Сообщение об ошибке. All primary keys defined, call setValue/getValue

    4226

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad number when defining a label

    4227

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad number when defining a subroutine

    4228

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal interpreter function in scan definition

    4229

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal register in interpreter function definition

    4230

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal state when calling getValue, probably not a read

    4231

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal state when calling interpreter routine

    4232

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Parallelism can only be between 1 and 240

    4233

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Calling execute (synchronous) when already prepared asynchronous transaction exists

    4234

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal to call setValue in this state

    4235

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No callback from execute

    4236

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trigger name too long

    4237

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many triggers

    4238

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trigger not found

    4239

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trigger with given name already exists

    4240

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported trigger type

    4241

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index name too long

    4242

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many indexes

    4243

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index not found

    4247

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal index/trigger create/drop/alter request

    4248

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trigger/index name invalid

    4249

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid table

    4250

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index type or index logging option

    4251

    Ошибка MySQL. HA_ERR_FOUND_DUPP_UNIQUE

    Сообщение об ошибке. Cannot create unique index, duplicate keys found

    4252

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Failed to allocate space for index

    4253

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Failed to create index table

    4254

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table not an index table

    4255

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Hash index attributes must be specified in same order as table attributes

    4256

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Must call Ndb::init() before this function

    4257

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Tried to read too much - too many getValue calls

    4258

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot create unique index, duplicate attributes found in definition

    4259

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid set of range scan bounds

    4264

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid usage of blob attribute

    4265

    Ошибка MySQL. DMEC

    Сообщение об ошибке. The method is not valid in current blob state

    4266

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid blob seek position

    4271

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index object, not retrieved via getIndex()

    4272

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table definition has undefined column

    4275

    Ошибка MySQL. DMEC

    Сообщение об ошибке. The blob method is incompatible with operation type or lock mode

    4276

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Missing NULL ptr in end of keyData list

    4277

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Key part len is to small for column

    4278

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Supplied buffer to small

    4279

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Malformed string

    4280

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistent key part length

    4281

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many keys specified for key bound in scanIndex

    4282

    Ошибка MySQL. DMEC

    Сообщение об ошибке. range_no not strictly increasing in ordered multi-range index scan

    4283

    Ошибка MySQL. DMEC

    Сообщение об ошибке. key_record in index scan is not an index ndbrecord

    4284

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot mix NdbRecAttr and NdbRecord methods in one operation

    4285

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NULL NdbRecord pointer

    4286

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid range_no (must be < 4096)

    4287

    Ошибка MySQL. DMEC

    Сообщение об ошибке. The key_record and attribute_record in primary key operation do not belong to the same table

    4288

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Blob handle for column not available

    4289

    Ошибка MySQL. DMEC

    Сообщение об ошибке. API version mismatch or wrong sizeof(NdbDictionary::RecordSpecification)

    4290

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Missing column specification in NdbDictionary::RecordSpecification

    4291

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Duplicate column specification in NdbDictionary::RecordSpecification

    4292

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbRecord for tuple access is not an index key NdbRecord

    4293

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Error returned from application scanIndex() callback

    4294

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Scan filter is too large, discarded

    4295

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Column is NULL in Get/SetValueSpec structure

    4296

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid AbortOption

    4297

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid or unsupported OperationOptions structure

    4298

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid or unsupported ScanOptions structure

    4299

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Incorrect combination of ScanOption flags, extraGetValues ptr and numExtraGetValues

    4300

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Tuple Key Type not correct

    4301

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Fragment Type not correct

    4302

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Minimum Load Factor not correct

    4303

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Maximum Load Factor not correct

    4304

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Maximum Load Factor smaller than Minimum

    4305

    Ошибка MySQL. DMEC

    Сообщение об ошибке. K value must currently be set to 6

    4306

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Memory Type not correct

    4307

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid table name

    4308

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attribute Size not correct

    4309

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Fixed array too large, maximum 64000 bytes

    4310

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attribute Type not correct

    4311

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Storage Mode not correct

    4312

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Null Attribute Type not correct

    4313

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index only storage for non-key attribute

    4314

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Storage Type of attribute not correct

    4315

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No more key attributes allowed after defining variable length key attribute

    4316

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Key attributes are not allowed to be NULL attributes

    4317

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many primary keys defined in table

    4318

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid attribute name or number

    4319

    Ошибка MySQL. DMEC

    Сообщение об ошибке. createAttribute called at erroneus place

    4322

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attempt to define distribution key when not prepared to

    4323

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Distribution Key set on table but not defined on first attribute

    4324

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attempt to define distribution group when not prepared to

    4325

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Distribution Group set on table but not defined on first attribute

    4326

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Distribution Group with erroneus number of bits

    4327

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Distribution key is only supported on part of primary key

    4328

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Disk memory attributes not yet supported

    4329

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Variable stored attributes not yet supported

    4335

    Ошибка 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

    4340

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Result or attribute record must be a base table ndbrecord, not an index ndbrecord

    4341

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not all keys read when using option SF_OrderBy

    4342

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Scan defined but not prepared

    4343

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table with blobs does not support refresh

    4400

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Status Error in NdbSchemaCon

    4401

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Only one schema operation per schema transaction

    4402

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No schema operation defined before calling execute

    4410

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema transaction is already started

    4411

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema transaction not possible until upgrade complete

    4412

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema transaction is not started

    4501

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Insert in hash table failed when getting table information from Ndb

    4502

    Ошибка MySQL. DMEC

    Сообщение об ошибке. GetValue not allowed in Update operation

    4503

    Ошибка MySQL. DMEC

    Сообщение об ошибке. GetValue not allowed in Insert operation

    4504

    Ошибка MySQL. DMEC

    Сообщение об ошибке. SetValue not allowed in Read operation

    4505

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NULL value not allowed in primary key search

    4506

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Missing getValue/setValue when calling execute

    4507

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Missing operation request when calling execute

    4508

    Ошибка MySQL. DMEC

    Сообщение об ошибке. GetValue not allowed for NdbRecord defined operation

    4509

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Non SF_MultiRange scan cannot have more than one bound

    4510

    Ошибка MySQL. DMEC

    Сообщение об ошибке. User specified partition id not allowed for scan takeover operation

    4511

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Blobs not allowed in NdbRecord delete result record

    4512

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Incorrect combination of OperationOptions optionsPresent, extraGet/SetValues ptr and numExtraGet/SetValues

    4513

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Only one scan bound allowed for non-NdbRecord setBound() API

    4514

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Can only call setBound/equal() for an NdbIndexScanOperation

    4515

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Method not allowed for NdbRecord, use OperationOptions or ScanOptions structure instead

    4516

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal instruction in interpreted program

    4517

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad label in branch instruction

    4518

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many instructions in interpreted program

    4519

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbInterpretedCode::finalise() not called

    4520

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Call to undefined subroutine

    4521

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Call to undefined subroutine, internal error

    4522

    Ошибка MySQL. DMEC

    Сообщение об ошибке. setBound() called twice for same key

    4523

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Pseudo columns not supported by NdbRecord

    4524

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbInterpretedCode is for different table

    4535

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attempt to set bound on non key column

    4536

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbScanFilter constructor taking NdbOperation is not supported for NdbRecord

    4537

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Wrong API. Use NdbInterpretedCode for NdbRecord operations

    4538

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbInterpretedCode instruction requires that table is set

    4539

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbInterpretedCode not supported for operation type

    4540

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attempt to pass an Index column to createRecord. Use base table columns only

    4542

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unknown partition information type

    4543

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Duplicate partitioning information supplied

    4544

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Wrong partitionInfo type for table

    4545

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid or Unsupported PartitionInfo structure

    4546

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Explicit partitioning info not allowed for table and operation

    4547

    Ошибка MySQL. DMEC

    Сообщение об ошибке. RecordSpecification has overlapping offsets

    4548

    Ошибка MySQL. DMEC

    Сообщение об ошибке. RecordSpecification has too many elements

    4549

    Ошибка MySQL. DMEC

    Сообщение об ошибке. getLockHandle only supported for primary key read with a lock

    4550

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot releaseLockHandle until operation executed

    4551

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbLockHandle already released

    4552

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbLockHandle does not belong to transaction

    4553

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbLockHandle original operation not executed successfully

    4554

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbBlob can only be closed from Active state

    4555

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbBlob cannot be closed with pending operations

    4556

    Ошибка MySQL. DMEC

    Сообщение об ошибке. RecordSpecification has illegal value in column_flags

    4557

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Column types must be identical when comparing two columns

    4600

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction is already started

    4601

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction is not started

    4602

    Ошибка MySQL. DMEC

    Сообщение об ошибке. You must call getNdbOperation before executeScan

    4603

    Ошибка MySQL. DMEC

    Сообщение об ошибке. There can only be ONE operation in a scan transaction

    4604

    Ошибка MySQL. DMEC

    Сообщение об ошибке. takeOverScanOp, to take over a scanned row one must explicitly request keyinfo on readTuples call

    4605

    Ошибка MySQL. DMEC

    Сообщение об ошибке. You may only call readTuples() once for each operation

    4607

    Ошибка MySQL. DMEC

    Сообщение об ошибке. There may only be one operation in a scan transaction

    4608

    Ошибка MySQL. DMEC

    Сообщение об ошибке. You can not takeOverScan unless you have used openScanExclusive

    4609

    Ошибка MySQL. DMEC

    Сообщение об ошибке. You must call nextScanResult before trying to takeOverScan

    4707

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many event have been defined

    4708

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Event name is too long

    4709

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Can't accept more subscribers

    4710

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Event not found

    4711

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Creation of event failed

    4712

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Stopped event operation does not exist. Already stopped?

    4714

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX do not exist

    4715

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats for specified index do not exist

    4716

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats methods usage error

    4717

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats cannot allocate memory

    4720

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX partly missing or invalid

    4723

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Mysqld: index stats request ignored due to recent error

    4724

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Mysqld: index stats request aborted by stats thread

    4725

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats were deleted by another process

    720

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attribute name reused in table definition

    763

    Ошибка MySQL. DMEC

    Сообщение об ошибке. DDL is not supported with mixed data-node versions

    771

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Given NODEGROUP doesn't exist in this cluster

    776

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index created on temporary table must itself be temporary

    777

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot create a temporary index on a non-temporary table

    778

    Ошибка MySQL. DMEC

    Сообщение об ошибке. A temporary table or index must be specified as not logging

    789

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Logfile group not found

    793

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Object definition too big

    794

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema feature requires data node upgrade

    798

    Ошибка MySQL. DMEC

    Сообщение об ошибке. A disk table must not be specified as no logging

    823

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too much attrinfo from application in tuple manager

    829

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Corrupt data received for insert/update

    831

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many nullable/bitfields in table definition

    850

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too long or too short default value

    851

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Fixed-size column offset exceeded max. Use VARCHAR or COLUMN_FORMAT DYNAMIC for memory-stored columns

    874

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too much attrinfo (e.g. scan filter) for scan in tuple manager

    876

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 876

    877

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 877

    878

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 878

    879

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 879

    880

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Tried to read too much - too many getValue calls

    884

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Stack overflow in interpreter

    885

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Stack underflow in interpreter

    886

    Ошибка MySQL. DMEC

    Сообщение об ошибке. More than 65535 instructions executed in interpreter

    892

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported type in scan filter

    897

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Update attempt of primary key via ndbcluster internal api (if this occurs via the MySQL server it is a bug, please report)

    912

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stat scan requested with wrong lock mode

    913

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index for index stats update

    920

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Row operation defined after refreshTuple()

    INVALID_BLOCK_NAME

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid block name

    INVALID_ERROR_NUMBER

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid error number. Should be >= 0.

    INVALID_TRACE_NUMBER

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid trace number.

    NODE_NOT_API_NODE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. The specified node is not an API node.

    NODE_SHUTDOWN_IN_PROGESS

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node shutdown in progress

    NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node shutdown would cause system crash

    NO_CONTACT_WITH_DB_NODES

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No contact with database nodes }

    NO_CONTACT_WITH_PROCESS

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No contact with the process (dead ?).

    OPERATION_NOT_ALLOWED_START_STOP

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Operation not allowed while nodes are starting or stopping.

    QRY_BATCH_SIZE_TOO_SMALL

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Batch size for sub scan cannot be smaller than number of fragments.

    QRY_CHAR_OPERAND_TRUNCATED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Character operand was right truncated

    QRY_CHAR_PARAMETER_TRUNCATED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Character Parameter was right truncated

    QRY_DEFINITION_TOO_LARGE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query definition too large.

    QRY_EMPTY_PROJECTION

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query has operation with empty projection.

    QRY_HAS_ZERO_OPERATIONS

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query defintion should have at least one operation.

    QRY_ILLEGAL_STATE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query is in illegal state for this operation.

    QRY_IN_ERROR_STATE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. A previous query operation failed, which you missed to catch.

    QRY_MULTIPLE_PARENTS

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Multiple 'parents' specified in linkedValues for this operation

    QRY_MULTIPLE_SCAN_SORTED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query with multiple scans may not be sorted.

    QRY_NUM_OPERAND_RANGE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Numeric operand out of range

    QRY_OPERAND_ALREADY_BOUND

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Can't use same operand value to specify different column values

    QRY_OPERAND_HAS_WRONG_TYPE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Incompatible datatype specified in operand argument

    QRY_PARAMETER_HAS_WRONG_TYPE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Parameter value has an incompatible datatype

    QRY_REQ_ARG_IS_NULL

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Required argument is NULL

    QRY_RESULT_ROW_ALREADY_DEFINED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Result row already defined for NdbQueryOperation.

    QRY_SCAN_ORDER_ALREADY_SET

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index scan order was already set in query definition.

    QRY_SEQUENTIAL_SCAN_SORTED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Parallelism cannot be restricted for sorted scans.

    QRY_TOO_FEW_KEY_VALUES

    Ошибка MySQL. DMEC

    Сообщение об ошибке. All required 'key' values was not specified

    QRY_TOO_MANY_KEY_VALUES

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many 'key' or 'bound' values was specified

    QRY_UNKNOWN_PARENT

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unknown 'parent' specified in linkedValue

    QRY_UNRELATED_INDEX

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Specified 'index' does not belong to specified 'table'

    QRY_WRONG_INDEX_TYPE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Wrong type of index specified for this operation

    QRY_WRONG_OPERATION_TYPE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. This method cannot be invoked on this type of operation (lookup/scan/index scan).

    SEND_OR_RECEIVE_FAILED

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Send to process or receive failed.

    SYSTEM_SHUTDOWN_IN_PROGRESS

    Ошибка MySQL. DMEC

    Сообщение об ошибке. System shutdown in progress

    UNSUPPORTED_NODE_SHUTDOWN

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported multi node shutdown. Abort option required.

    WRONG_PROCESS_TYPE

    Ошибка MySQL. DMEC

    Сообщение об ошибке. The process has wrong type. Expected a DB process.

    2.4.2.3. Никакие данные не найдены

    626

    Ошибка MySQL. HA_ERR_KEY_NOT_FOUND

    Сообщение об ошибке. Tuple did not exist

    2.4.2.4. Ограничительное нарушение

    255

    Ошибка MySQL. HA_ERR_NO_REFERENCED_ROW

    Сообщение об ошибке. Foreign key constraint violated: No parent row found

    256

    Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED

    Сообщение об ошибке. Foreign key constraint violated: Referenced row exists

    630

    Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY

    Сообщение об ошибке. Tuple already existed when attempting to insert

    839

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Illegal null attribute

    840

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL

    893

    Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY

    Сообщение об ошибке. Constraint violation e.g. duplicate value in unique index

    2.4.2.5. Ошибка схемы

    1224

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Too many fragments

    1225

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table not defined in local query handler

    1226

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. Table is being dropped

    1227

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Invalid schema version

    1228

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot use drop table for drop index

    1229

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too long frm data supplied

    1231

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid table or index to scan

    1232

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid table or index to scan

    1407

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscription not found in subscriber manager

    1415

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscription not unique in subscriber manager

    1417

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table in suscription not defined, probably dropped

    1418

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscription dropped, no new subscribers allowed

    1419

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscription already dropped

    1421

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Partially connected API in NdbOperation::execute()

    1422

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of subscription records

    1423

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of table records in SUMA

    1424

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of MaxNoOfConcurrentSubOperations

    1425

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscription being defined... while trying to stop subscriber

    1426

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No such subscriber

    1503

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of filegroup records

    1504

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of logbuffer memory(specify smaller undo_buffer_size or increase SharedGlobalMemory)

    1508

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of file records

    1509

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File system error, check if path, permissions etc

    1512

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File read error

    1514

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Currently there is a limit of one logfile group

    1515

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Currently there is a 4G limit of one undo/data-file in 32-bit host

    1516

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File too small

    1517

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Insufficient disk page buffer memory. Increase DiskPageBufferMemory or reduce data file size.

    20019

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. Query table not defined

    20020

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. Query table is being dropped

    20021

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Сообщение об ошибке. Query table definition has changed

    21022

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - parent table is not table

    21023

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid parent table version

    21024

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - child table is not table

    21025

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid child table version

    21027

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid parent index version

    21028

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - child index is not index

    21029

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid child index version

    21041

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Drop foreign key failed in NDB - invalid foreign key version

    21042

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found in TC

    21061

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Build foreign key failed in NDB - invalid foreign key version

    241

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Сообщение об ошибке. Invalid schema object version

    283

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. Table is being dropped

    284

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Сообщение об ошибке. Table not defined in transaction coordinator

    285

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unknown table error in transaction coordinator

    4713

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Column defined in event does not exist in table

    703

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid table format

    704

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Attribute name too long

    705

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Table name too long

    707

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No more table metadata records (increase MaxNoOfTables)

    708

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No more attribute metadata records (increase MaxNoOfAttributes)

    709

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. No such table existed

    710

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Internal: Get by table name not supported, use table id.

    712

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No more hashmap metadata records

    723

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. No such table existed

    736

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported array size

    737

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Attribute array size too big

    738

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Record too big

    739

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Unsupported primary key length

    740

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Nullable primary key not supported

    741

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported alter table

    743

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Unsupported character set in table or index

    744

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Character string is invalid for given character set

    745

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Distribution key not supported for char attribute (use binary attribute)

    750

    Ошибка MySQL. IE

    Сообщение об ошибке. Invalid file type

    751

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of file records

    752

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid file format

    753

    Ошибка MySQL. IE

    Сообщение об ошибке. Invalid filegroup for file

    754

    Ошибка MySQL. IE

    Сообщение об ошибке. Invalid filegroup version when creating file

    755

    Ошибка MySQL. HA_MISSING_CREATE_OPTION

    Сообщение об ошибке. Invalid tablespace

    756

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index on disk column is not supported

    757

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Varsize bitfield not supported

    758

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Tablespace has changed

    759

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid tablespace version

    760

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File already exists

    761

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unable to drop table as backup is in progress

    762

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unable to alter table as backup is in progress

    764

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Invalid extent size

    765

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of filegroup records

    766

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cant drop file, no such file

    767

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cant drop filegroup, no such filegroup

    768

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cant drop filegroup, filegroup is used

    769

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Drop undofile not supported, drop logfile group instead

    770

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cant drop file, file is used

    773

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of string memory, please modify StringMemory config parameter

    774

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid schema object for drop

    775

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create file is not supported when Diskless=1

    779

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Invalid undo buffer size

    790

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Invalid hashmap

    791

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Too many total bits in bitfields

    792

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Default value for primary key column not supported

    796

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of schema transaction memory

    799

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Non default partitioning without partitions

    881

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unable to create table, out of data pages (increase DataMemory)

    906

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported attribute type in index

    907

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unsupported character set in table or index

    910

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Сообщение об ошибке. Index is being dropped

    911

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stat scan requested on index with unsupported key size

    2.4.2.6. Объект схемы уже существует

    4244

    Ошибка MySQL. HA_ERR_TABLE_EXIST

    Сообщение об ошибке. Index or table with given name already exists

    721

    Ошибка MySQL. HA_ERR_TABLE_EXIST

    Сообщение об ошибке. Schema object with given name already exists

    746

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Event name already exists

    2.4.2.7. Пользователь определил ошибку

    1321

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup aborted by user request

    4260

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbScanFilter: Operator is not defined in NdbScanFilter::Group

    4261

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbScanFilter: Column is NULL

    4262

    Ошибка MySQL. DMEC

    Сообщение об ошибке. NdbScanFilter: Condition is out of bounds

    2.4.2.8. Недостаточно места

    1303

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of resources

    1412

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Can't accept more subscribers, out of space in pool

    1416

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Can't accept more subscriptions, out of space in pool

    1601

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Out of extents, tablespace full

    1602

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No datafile in tablespace

    1603

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)

    1604

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Error -1 from get_page

    1605

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Out of page request records when allocating disk record

    1606

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Out of extent records when allocating disk record

    623

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. 623

    624

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. 624

    625

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Сообщение об ошибке. Out of memory in Ndb Kernel, hash index part (increase DataMemory)

    633

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Сообщение об ошибке. Table fragment hash index has reached maximum possible size

    640

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many hash indexes (should not happen)

    747

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of event records

    826

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Too many tables and attributes (increase MaxNoOfAttributes or MaxNoOfTables)

    827

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Out of memory in Ndb Kernel, table data (increase DataMemory)

    889

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)

    902

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Сообщение об ошибке. Out of memory in Ndb Kernel, ordered index data (increase DataMemory)

    903

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Сообщение об ошибке. Too many ordered indexes (increase MaxNoOfOrderedIndexes)

    904

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Сообщение об ошибке. Out of fragment records (increase MaxNoOfOrderedIndexes)

    905

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of attribute records (increase MaxNoOfAttributes)

    908

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid ordered index tree node size

    2.4.2.9. Временная ошибка ресурса

    1217

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of operation records in local data manager (increase SharedGlobalMemory)

    1218

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Send Buffers overloaded in NDB kernel

    1220

    Ошибка MySQL. DMEC

    Сообщение об ошибке. REDO log files overloaded (increase FragmentLogFileSize)

    1222

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction markers in LQH, increase SharedGlobalMemory

    1234

    Ошибка MySQL. DMEC

    Сообщение об ошибке. REDO log files overloaded (increase disk hardware)

    1350

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup failed: file already exists (use 'START BACKUP <backup id>')

    1411

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber manager busy with adding/removing a subscriber

    1413

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber manager busy with adding the subscription

    1414

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber manager has subscribers on this subscription

    1420

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber manager busy with adding/removing a table

    1501

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of undo space

    20000

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due out of operation records

    20006

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to out of LongMessageBuffer

    20008

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to out of query memory

    20015

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to out of row memory

    21020

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - no more object records

    217

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 217

    218

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of LongMessageBuffer

    219

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 219

    221

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many concurrently fired triggers, increase SharedGlobalMemory

    233

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of operation records in transaction coordinator (increase SharedGlobalMemory)

    245

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many active scans, increase MaxNoOfConcurrentScans

    251

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of frag location records in TC (increase SharedGlobalMemory)

    273

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction markers databuffer in TC, increase SharedGlobalMemory

    275

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction records for complete phase (increase SharedGlobalMemory)

    279

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction markers in TC, increase SharedGlobalMemory

    2810

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No space left on the device

    2811

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Error with file permissions, please check file system

    2815

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Error in reading files, please check file system

    288

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of index operations in transaction coordinator (increase SharedGlobalMemory)

    289

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction buffer memory in TC (increase SharedGlobalMemory)

    291

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of scanfrag records in TC (increase SharedGlobalMemory)

    293

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of attribute buffers in TC block, increase SharedGlobalMemory

    312

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of LongMessageBuffer

    4021

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    4022

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    4032

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    414

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 414

    418

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction buffers in LQH, increase LongSignalMemory

    419

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of signal memory, increase LongSignalMemory

    488

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many active scans

    489

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of scan records in LQH, increase SharedGlobalMemory

    490

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many active scans

    748

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Busy during read of event table

    780

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many schema transactions

    783

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many schema operations

    784

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid schema transaction state

    785

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema object is busy with another schema transaction

    788

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Missing schema operation at takeover of schema transaction

    805

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of attrinfo records in tuple manager, increase LongSignalMemory

    830

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of add fragment operation records

    873

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, ordered index data (increase SharedGlobalMemory)

    899

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Rowid already allocated

    909

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, ordered scan operation (increase SharedGlobalMemory)

    915

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No free index stats op

    918

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot prepare index stats update

    919

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot execute index stats update

    921

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, copy tuples (increase SharedGlobalMemory)

    923

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of UNDO buffer memory (increase UNDO_BUFFER_SIZE)

    924

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, stored procedure record (increase SharedGlobalMemory)

    925

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, tup scan operation (increase SharedGlobalMemory)

    926

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of transaction memory in local data manager, acc scan operation (increase SharedGlobalMemory)

    2.4.2.10. Ошибка восстановления узла

    1204

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Temporary failure, distribution changed

    1405

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber manager busy with node recovery

    1427

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Api node died, when SUB_START_REQ reached node

    20016

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to node failure

    250

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node where lock was held crashed, restart scan transaction

    286

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4002

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Send to NDB failed

    4007

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Send to ndbd node failed

    4010

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4013

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Request timed out in waiting for node failure

    4025

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4027

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4028

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4029

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4031

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure caused abort of transaction

    4033

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Send to NDB failed

    4035

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cluster temporary unavailable

    4115

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction was committed but all read information was not received due to node crash

    4119

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Simple/dirty read failed due to node failure

    499

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Scan take over error, restart scan transaction

    631

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Scan take over error, restart scan transaction

    786

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema transaction aborted due to node-failure

    2.4.2.11. Ошибки перегрузки

    1221

    Ошибка MySQL. DMEC

    Сообщение об ошибке. REDO buffers overloaded (increase RedoBuffer)

    1518

    Ошибка MySQL. DMEC

    Сообщение об ошибке. IO overload error

    4006

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Connect failure - out of connection objects (increase MaxNoOfConcurrentTransactions)

    410

    Ошибка MySQL. DMEC

    Сообщение об ошибке. REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)

    677

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index UNDO buffers overloaded (increase UndoIndexBuffer)

    701

    Ошибка MySQL. DMEC

    Сообщение об ошибке. System busy with other schema operation

    711

    Ошибка MySQL. DMEC

    Сообщение об ошибке. System busy with node restart, schema operations not allowed

    891

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Data UNDO buffers overloaded (increase UndoDataBuffer)

    2.4.2.12. Тайм-аут кончился

    237

    Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT

    Сообщение об ошибке. Transaction had timed out when trying to commit it

    266

    Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT

    Сообщение об ошибке. Time-out in NDB, probably caused by deadlock

    4351

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Timeout/deadlock during index build

    5024

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Time-out due to node shutdown not starting in time

    5025

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Time-out due to node shutdown not completing in time

    2.4.2.13. Закрытие узла

    1223

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Read operation aborted due to node shutdown

    270

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction aborted due to node shutdown

    280

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4023

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4030

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4034

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction aborted due to node shutdown

    2.4.2.14. Внутренняя временная ошибка

    1703

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Node failure handling not completed

    1705

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Not ready for connection allocation yet

    702

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Request to non-master

    787

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Schema transaction aborted

    2.4.2.15. Неизвестная ошибка результата

    4008

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Receive from NDB failed

    4009

    Ошибка MySQL. HA_ERR_NO_CONNECTION

    Сообщение об ошибке. Cluster Failure

    4012

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Request ndbd time-out, maybe due to high load or communication problems

    2.4.2.16. Внутренняя ошибка

    1300

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Undefined error

    1301

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup issued to not master (reissue command to master)

    1304

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Sequence failure

    1305

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup definition not implemented

    1322

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup already completed

    1323

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 1323

    1324

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup log buffer full

    1325

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File or scan error

    1326

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup aborted due to node failure

    1327

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 1327

    1340

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Backup undefined error

    1428

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No replica to scan on this node (internal index stats error)

    1429

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Subscriber node undefined in SubStartReq (config change?)

    1502

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Filegroup already exists

    1505

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid filegroup

    1506

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid filegroup version

    1507

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File no already inuse

    1510

    Ошибка MySQL. DMEC

    Сообщение об ошибке. File meta data error

    1511

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of memory

    1513

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Filegroup not online

    1700

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Undefined error

    20001

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to empty query tree

    20002

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid request

    20003

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to unknown query operation

    20004

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid tree node specification

    20005

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification

    20007

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid pattern

    20009

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to query node too big

    20010

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to query node parameters too big

    20011

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to both tree and parameters contain interpreted program

    20012

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Key parameter bits mismatch

    20013

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Incorrect key parameter count

    20014

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to internal error

    20017

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to invalid node count

    20018

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Query aborted due to index fragment not found

    202

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 202

    203

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 203

    207

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 207

    208

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 208

    209

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Communication problem, signal error

    21021

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid request

    21030

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - object already exists in TC

    21031

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - no more object records in TC

    21032

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Create foreign key failed in NDB - invalid request to TC

    220

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 220

    230

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 230

    232

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 232

    238

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 238

    240

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid data encountered during foreign key trigger execution

    271

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Simple Read transaction without any attributes to read

    272

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Update operation without any attributes to update

    276

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 276

    277

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 277

    278

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 278

    287

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index corrupted

    290

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Corrupt key in TC, unable to xfrm

    292

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistent index state in TC block

    294

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unlocked operation has out of range index

    295

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unlocked operation has invalid state

    298

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid distribution key

    306

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of fragment records in DIH

    4000

    Ошибка MySQL. DMEC

    Сообщение об ошибке. MEMORY ALLOCATION ERROR

    4001

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Signal Definition Error

    4005

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Internal Error in NdbApi

    4011

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Internal Error in NdbApi

    4107

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Simple Transaction and Not Start

    4108

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Faulty operation type

    4109

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Faulty primary key attribute length

    4110

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Faulty length in ATTRINFO signal

    4111

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Status Error in NdbConnection

    4113

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Too many operations received

    416

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad state handling unlock request

    4263

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid blob attributes or invalid blob parts table

    4267

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Corrupted blob value

    4268

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Error in blob head update forced rollback of transaction

    4269

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No connection to ndb management server

    4270

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Unknown blob error

    4273

    Ошибка MySQL. DMEC

    Сообщение об ошибке. No blob table in dict cache

    4274

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Corrupted main table PK in blob operation

    4320

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Cannot use the same object twice to create table

    4321

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Trying to start two schema transactions

    4344

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Only DBDICT and TRIX can send requests to TRIX

    4345

    Ошибка MySQL. DMEC

    Сообщение об ошибке. TRIX block is not available yet, probably due to node failure

    4346

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Internal error at index create/build

    4347

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Bad state at alter index

    4348

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistency detected at alter index

    4349

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistency detected at index usage

    4350

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Transaction already aborted

    4718

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats samples data or memory cache is invalid

    4719

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Index stats internal error

    4721

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Mysqld: index stats thread not open for requests

    4722

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Mysqld: index stats entry unexpectedly not found

    4731

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Event not found

    632

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 632

    706

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistency during table creation

    749

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Primary Table in wrong state

    772

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Сообщение об ошибке. Given fragmentType doesn't exist

    781

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid schema transaction key from NDB API

    782

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid schema transaction id from NDB API

    795

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Out of LongMessageBuffer in DICT

    809

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 809

    812

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 812

    833

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 833

    871

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 871

    882

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 882

    883

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 883

    887

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 887

    888

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 888

    890

    Ошибка MySQL. DMEC

    Сообщение об ошибке. 890

    896

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Tuple corrupted - wrong checksum or column data in invalid format

    901

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Inconsistent ordered index. The index needs to be dropped and recreated

    914

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index stats request

    916

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index stats sys tables

    917

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Invalid index stats sys tables data

    2.4.2.17. Функция не реализована

    4003

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Function not implemented yet

    797

    Ошибка MySQL. DMEC

    Сообщение об ошибке. Wrong fragment count for fully replicated table

    2.4.3. Коды ошибок NDB: общий листинг

    Эта секция перечисляет все ошибки NDB, упорядоченные по коду ошибки NDB. Каждый листинг также включает тип ошибки NDB, соответствующую ошибку MySQL Server и и текст сообщения об ошибке.

    0

    Ошибка MySQL. 0

    Тип ошибки NDB. No error

    Сообщение об ошибке. No error

    1204

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Temporary failure, distribution changed

    1217

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of operation records in local data manager (increase SharedGlobalMemory)

    1218

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Send Buffers overloaded in NDB kernel

    1220

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. REDO log files overloaded (increase FragmentLogFileSize)

    1221

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. REDO buffers overloaded (increase RedoBuffer)

    1222

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction markers in LQH, increase SharedGlobalMemory

    1223

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Read operation aborted due to node shutdown

    1224

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Too many fragments

    1225

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table not defined in local query handler

    1226

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table is being dropped

    1227

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid schema version

    1228

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Cannot use drop table for drop index

    1229

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Too long frm data supplied

    1231

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid table or index to scan

    1232

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid table or index to scan

    1233

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Table read-only

    1234

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. REDO log files overloaded (increase disk hardware)

    1300

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Undefined error

    1301

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup issued to not master (reissue command to master)

    1302

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. A backup is already running

    1303

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of resources

    1304

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Sequence failure

    1305

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup definition not implemented

    1306

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup not supported in diskless mode (change Diskless)

    1321

    Ошибка MySQL. DMEC

    Тип ошибки NDB. User defined error

    Сообщение об ошибке. Backup aborted by user request

    1322

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup already completed

    1323

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 1323

    1324

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup log buffer full

    1325

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. File or scan error

    1326

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup aborted due to node failure

    1327

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 1327

    1329

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup during software upgrade not supported

    1340

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Backup undefined error

    1342

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to allocate buffers (check configuration)

    1343

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to setup fs buffers (check configuration)

    1344

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to allocate tables (check configuration)

    1345

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to insert file header (check configuration)

    1346

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to insert table list (check configuration)

    1347

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to allocate table memory (check configuration)

    1348

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to allocate file record (check configuration)

    1349

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Backup failed to allocate attribute record (check configuration)

    1350

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Backup failed: file already exists (use 'START BACKUP <backup id>')

    1405

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Subscriber manager busy with node recovery

    1407

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Subscription not found in subscriber manager

    1411

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Subscriber manager busy with adding/removing a subscriber

    1412

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Can't accept more subscribers, out of space in pool

    1413

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Subscriber manager busy with adding the subscription

    1414

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Subscriber manager has subscribers on this subscription

    1415

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Subscription not unique in subscriber manager

    1416

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Can't accept more subscriptions, out of space in pool

    1417

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table in suscription not defined, probably dropped

    1418

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Subscription dropped, no new subscribers allowed

    1419

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Subscription already dropped

    1420

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Subscriber manager busy with adding/removing a table

    1421

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Partially connected API in NdbOperation::execute()

    1422

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of subscription records

    1423

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of table records in SUMA

    1424

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of MaxNoOfConcurrentSubOperations

    1425

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Subscription being defined... while trying to stop subscriber

    1426

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No such subscriber

    1427

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Api node died, when SUB_START_REQ reached node

    1428

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. No replica to scan on this node (internal index stats error)

    1429

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Subscriber node undefined in SubStartReq (config change?)

    1501

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of undo space

    1502

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Filegroup already exists

    1503

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of filegroup records

    1504

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of logbuffer memory(specify smaller undo_buffer_size or increase SharedGlobalMemory)

    1505

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid filegroup

    1506

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid filegroup version

    1507

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. File no already inuse

    1508

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of file records

    1509

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. File system error, check if path,permissions etc

    1510

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. File meta data error

    1511

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Out of memory

    1512

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. File read error

    1513

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Filegroup not online

    1514

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Currently there is a limit of one logfile group

    1515

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Currently there is a 4G limit of one undo/data-file in 32-bit host

    1516

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. File too small

    1517

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Insufficient disk page buffer memory. Increase DiskPageBufferMemory or reduce data file size.

    1518

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. IO overload error

    1601

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of extents, tablespace full

    1602

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. No datafile in tablespace

    1603

    Ошибка 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)

    1604

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Error -1 from get_page

    1605

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of page request records when allocating disk record

    1606

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of extent records when allocating disk record

    1700

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Undefined error

    1701

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Node already reserved

    1702

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Node already connected

    1703

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal temporary

    Сообщение об ошибке. Node failure handling not completed

    1704

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Node type mismatch

    1705

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal temporary

    Сообщение об ошибке. Not ready for connection allocation yet

    20000

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Query aborted due out of operation records

    20001

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to empty query tree

    20002

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid request

    20003

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to unknown query operation

    20004

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid tree node specification

    20005

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification

    20006

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Query aborted due to out of LongMessageBuffer

    20007

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid pattern

    20008

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Query aborted due to out of query memory

    20009

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to query node too big

    20010

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to query node parameters too big

    20011

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to both tree and parameters contain interpreted program

    20012

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Key parameter bits mismatch

    20013

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Incorrect key parameter count

    20014

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to internal error

    20015

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Query aborted due to out of row memory

    20016

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Query aborted due to node failure

    20017

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to invalid node count

    20018

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Query aborted due to index fragment not found

    20019

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Query table not defined

    20020

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Query table is being dropped

    20021

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Query table definition has changed

    202

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 202

    203

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 203

    207

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 207

    208

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 208

    209

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Communication problem, signal error

    21000

    Ошибка 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

    21020

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Create foreign key failed in NDB - no more object records

    21021

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid request

    21022

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - parent table is not table

    21023

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid parent table version

    21024

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - child table is not table

    21025

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid child table version

    21026

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Create foreign key failed in NDB - parent index is not unique index

    21027

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid parent index version

    21028

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - child index is not index

    21029

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid child index version

    21030

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Create foreign key failed in NDB - object already exists in TC

    21031

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Create foreign key failed in NDB - no more object records in TC

    21032

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Create foreign key failed in NDB - invalid request to TC

    21033

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Create foreign key failed in NDB - No parent row found

    21034

    Ошибка 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

    21040

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found

    21041

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Drop foreign key failed in NDB - invalid foreign key version

    21042

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found in TC

    21060

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Build foreign key failed in NDB - foreign key not found

    21061

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Build foreign key failed in NDB - invalid foreign key version

    21080

    Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Drop table not allowed in NDB - referenced by foreign key on another table

    21081

    Ошибка MySQL. HA_ERR_DROP_INDEX_FK

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Drop index not allowed in NDB - used as parent index of a foreign key

    21082

    Ошибка MySQL. HA_ERR_DROP_INDEX_FK

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Drop index not allowed in NDB - used as child index of a foreign key

    21090

    Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Create foreign key failed in NDB - name contains invalid character (/)

    217

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. 217

    218

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of LongMessageBuffer

    219

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. 219

    220

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 220

    221

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many concurrently fired triggers, increase SharedGlobalMemory

    230

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 230

    232

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 232

    233

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of operation records in transaction coordinator (increase SharedGlobalMemory)

    237

    Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT

    Тип ошибки NDB. Timeout expired

    Сообщение об ошибке. Transaction had timed out when trying to commit it

    238

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 238

    240

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid data encountered during foreign key trigger execution

    241

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid schema object version

    242

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Zero concurrency in scan

    244

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too high concurrency in scan

    245

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many active scans, increase MaxNoOfConcurrentScans

    250

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node where lock was held crashed, restart scan transaction

    251

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of frag location records in TC (increase SharedGlobalMemory)

    255

    Ошибка MySQL. HA_ERR_NO_REFERENCED_ROW

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Foreign key constraint violated: No parent row found

    256

    Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Foreign key constraint violated: Referenced row exists

    261

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. DML count in transaction exceeds config parameter MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations

    266

    Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT

    Тип ошибки NDB. Timeout expired

    Сообщение об ошибке. Time-out in NDB, probably caused by deadlock

    269

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No condition and attributes to read in scan

    270

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Transaction aborted due to node shutdown

    271

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Simple Read transaction without any attributes to read

    272

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Update operation without any attributes to update

    273

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction markers databuffer in TC, increase SharedGlobalMemory

    275

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction records for complete phase (increase SharedGlobalMemory)

    276

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 276

    277

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 277

    278

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 278

    279

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction markers in TC, increase SharedGlobalMemory

    280

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Transaction aborted due to node shutdown

    281

    Ошибка MySQL. HA_ERR_NO_CONNECTION

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Operation not allowed due to cluster shutdown in progress

    2810

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. No space left on the device

    2811

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Error with file permissions, please check file system

    2815

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Error in reading files, please check file system

    283

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table is being dropped

    284

    Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table not defined in transaction coordinator

    285

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unknown table error in transaction coordinator

    286

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    287

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Index corrupted

    288

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of index operations in transaction coordinator (increase SharedGlobalMemory)

    289

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction buffer memory in TC (increase SharedGlobalMemory)

    290

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Corrupt key in TC, unable to xfrm

    291

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of scanfrag records in TC (increase SharedGlobalMemory)

    292

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Inconsistent index state in TC block

    293

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of attribute buffers in TC block, increase SharedGlobalMemory

    294

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Unlocked operation has out of range index

    295

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Unlocked operation has invalid state

    298

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid distribution key

    299

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Operation not allowed or aborted due to single user mode

    306

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Out of fragment records in DIH

    311

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Undefined partition used in setPartitionId

    312

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of LongMessageBuffer

    320

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid no of nodes specified for new nodegroup

    321

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid nodegroup id

    322

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node already in nodegroup

    323

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid nodegroup id, nodegroup already existing

    324

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, no node in nodegroup is started

    325

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node ID invalid or undefined

    4000

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. MEMORY ALLOCATION ERROR

    4001

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Signal Definition Error

    4002

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Send to NDB failed

    4003

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Function not implemented

    Сообщение об ошибке. Function not implemented yet

    4004

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attribute name or id not found in the table

    4005

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Internal Error in NdbApi

    4006

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. Connect failure - out of connection objects (increase MaxNoOfConcurrentTransactions)

    4007

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Send to ndbd node failed

    4008

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Unknown result error

    Сообщение об ошибке. Receive from NDB failed

    4009

    Ошибка MySQL. HA_ERR_NO_CONNECTION

    Тип ошибки NDB. Unknown result error

    Сообщение об ошибке. Cluster Failure

    4010

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4011

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Internal Error in NdbApi

    4012

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Unknown result error

    Сообщение об ошибке. Request ndbd time-out, maybe due to high load or communication problems

    4013

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Request timed out in waiting for node failure

    4021

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    4022

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    4023

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4025

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4027

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4028

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4029

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4030

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4031

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Node failure caused abort of transaction

    4032

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of Send Buffer space in NDB API

    4033

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Send to NDB failed

    4034

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node shutdown

    Сообщение об ошибке. Transaction aborted due to node shutdown

    4035

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Cluster temporary unavailable

    410

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)

    4100

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Status Error in NDB

    4101

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No connections to NDB available and connect failed

    4102

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Type in NdbTamper not correct

    4103

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No schema connections to NDB available and connect failed

    4104

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Ndb Init in wrong state, destroy Ndb object and create a new

    4105

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many Ndb objects

    4106

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. All Not NULL attribute have not been defined

    4107

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Simple Transaction and Not Start

    4108

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Faulty operation type

    4109

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Faulty primary key attribute length

    4110

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Faulty length in ATTRINFO signal

    4111

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Status Error in NdbConnection

    4113

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Too many operations received

    4114

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Transaction is already completed

    4115

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Transaction was committed but all read information was not received due to node crash

    4116

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Operation was not defined correctly, probably missing a key

    4117

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Could not start transporter, configuration error

    4118

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Parameter error in API call

    4119

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Simple/dirty read failed due to node failure

    4120

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Scan already complete

    4121

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot set name twice for an Ndb object

    4122

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot set name after Ndb object is initialised

    4123

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Free percent out of range. Allowed range is 1-99

    414

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. 414

    416

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Bad state handling unlock request

    417

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Bad operation reference - double unlock

    418

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction buffers in LQH, increase LongSignalMemory

    419

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of signal memory, increase LongSignalMemory

    4200

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Status Error when defining an operation

    4201

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Variable Arrays not yet supported

    4202

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Set value on tuple key attribute is not allowed

    4203

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL

    4204

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Set value and Read/Delete Tuple is incompatible

    4205

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No Key attribute used to define tuple

    4206

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not allowed to equal key attribute twice

    4207

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Key size is limited to 4092 bytes

    4208

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trying to read a non-stored attribute

    4209

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Length parameter in equal/setValue is incorrect

    4210

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Ndb sent more info than the length he specified

    4211

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Inconsistency in list of NdbRecAttr-objects

    4212

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Ndb reports NULL value on Not NULL attribute

    4213

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not all data of an attribute has been received

    4214

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not all attributes have been received

    4215

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. More data received than reported in TCKEYCONF message

    4216

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. More than 8052 bytes in setValue cannot be handled

    4217

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. It is not allowed to increment any other than unsigned ints

    4218

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Currently not allowed to increment NULL-able attributes

    4219

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits

    4220

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits

    4221

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trying to jump to a non-defined label

    4222

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Label was not found, internal error

    4223

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not allowed to create jumps to yourself

    4224

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not allowed to jump to a label in a different subroutine

    4225

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. All primary keys defined, call setValue/getValue

    4226

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Bad number when defining a label

    4227

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Bad number when defining a subroutine

    4228

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal interpreter function in scan definition

    4229

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal register in interpreter function definition

    4230

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal state when calling getValue, probably not a read

    4231

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal state when calling interpreter routine

    4232

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Parallelism can only be between 1 and 240

    4233

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Calling execute (synchronous) when already prepared asynchronous transaction exists

    4234

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal to call setValue in this state

    4235

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No callback from execute

    4236

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trigger name too long

    4237

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many triggers

    4238

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trigger not found

    4239

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trigger with given name already exists

    4240

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Unsupported trigger type

    4241

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index name too long

    4242

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many indexes

    4243

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index not found

    4244

    Ошибка MySQL. HA_ERR_TABLE_EXIST

    Тип ошибки NDB. Schema object already exists

    Сообщение об ошибке. Index or table with given name already exists

    4247

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal index/trigger create/drop/alter request

    4248

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Trigger/index name invalid

    4249

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid table

    4250

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid index type or index logging option

    4251

    Ошибка MySQL. HA_ERR_FOUND_DUPP_UNIQUE

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot create unique index, duplicate keys found

    4252

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Failed to allocate space for index

    4253

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Failed to create index table

    4254

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Table not an index table

    4255

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Hash index attributes must be specified in same order as table attributes

    4256

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Must call Ndb::init() before this function

    4257

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Tried to read too much - too many getValue calls

    4258

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot create unique index, duplicate attributes found in definition

    4259

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid set of range scan bounds

    4260

    Ошибка MySQL. DMEC

    Тип ошибки NDB. User defined error

    Сообщение об ошибке. NdbScanFilter: Operator is not defined in NdbScanFilter::Group

    4261

    Ошибка MySQL. DMEC

    Тип ошибки NDB. User defined error

    Сообщение об ошибке. NdbScanFilter: Column is NULL

    4262

    Ошибка MySQL. DMEC

    Тип ошибки NDB. User defined error

    Сообщение об ошибке. NdbScanFilter: Condition is out of bounds

    4263

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid blob attributes or invalid blob parts table

    4264

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid usage of blob attribute

    4265

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. The method is not valid in current blob state

    4266

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid blob seek position

    4267

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Corrupted blob value

    4268

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Error in blob head update forced rollback of transaction

    4269

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. No connection to ndb management server

    4270

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Unknown blob error

    4271

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid index object, not retrieved via getIndex()

    4272

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Table definition has undefined column

    4273

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. No blob table in dict cache

    4274

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Corrupted main table PK in blob operation

    4275

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. The blob method is incompatible with operation type or lock mode

    4276

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Missing NULL ptr in end of keyData list

    4277

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Key part len is to small for column

    4278

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Supplied buffer to small

    4279

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Malformed string

    4280

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Inconsistent key part length

    4281

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many keys specified for key bound in scanIndex

    4282

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. range_no not strictly increasing in ordered multi-range index scan

    4283

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. key_record in index scan is not an index ndbrecord

    4284

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot mix NdbRecAttr and NdbRecord methods in one operation

    4285

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NULL NdbRecord pointer

    4286

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid range_no (must be < 4096)

    4287

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. The key_record and attribute_record in primary key operation do not belong to the same table

    4288

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Blob handle for column not available

    4289

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. API version mismatch or wrong sizeof(NdbDictionary::RecordSpecification)

    4290

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Missing column specification in NdbDictionary::RecordSpecification

    4291

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Duplicate column specification in NdbDictionary::RecordSpecification

    4292

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbRecord for tuple access is not an index key NdbRecord

    4293

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Error returned from application scanIndex() callback

    4294

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Scan filter is too large, discarded

    4295

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Column is NULL in Get/SetValueSpec structure

    4296

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid AbortOption

    4297

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid or unsupported OperationOptions structure

    4298

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid or unsupported ScanOptions structure

    4299

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Incorrect combination of ScanOption flags, extraGetValues ptr and numExtraGetValues

    4300

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Tuple Key Type not correct

    4301

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Fragment Type not correct

    4302

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Minimum Load Factor not correct

    4303

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Maximum Load Factor not correct

    4304

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Maximum Load Factor smaller than Minimum

    4305

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. K value must currently be set to 6

    4306

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Memory Type not correct

    4307

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid table name

    4308

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attribute Size not correct

    4309

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Fixed array too large, maximum 64000 bytes

    4310

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attribute Type not correct

    4311

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Storage Mode not correct

    4312

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Null Attribute Type not correct

    4313

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index only storage for non-key attribute

    4314

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Storage Type of attribute not correct

    4315

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No more key attributes allowed after defining variable length key attribute

    4316

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Key attributes are not allowed to be NULL attributes

    4317

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many primary keys defined in table

    4318

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid attribute name or number

    4319

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. createAttribute called at erroneus place

    4320

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Cannot use the same object twice to create table

    4321

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Trying to start two schema transactions

    4322

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attempt to define distribution key when not prepared to

    4323

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Distribution Key set on table but not defined on first attribute

    4324

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attempt to define distribution group when not prepared to

    4325

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Distribution Group set on table but not defined on first attribute

    4326

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Distribution Group with erroneus number of bits

    4327

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Distribution key is only supported on part of primary key

    4328

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Disk memory attributes not yet supported

    4329

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Variable stored attributes not yet supported

    4335

    Ошибка 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

    4340

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Result or attribute record must be a base table ndbrecord, not an index ndbrecord

    4341

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Not all keys read when using option SF_OrderBy

    4342

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Scan defined but not prepared

    4343

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Table with blobs does not support refresh

    4344

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Only DBDICT and TRIX can send requests to TRIX

    4345

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. TRIX block is not available yet, probably due to node failure

    4346

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Internal error at index create/build

    4347

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Bad state at alter index

    4348

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Inconsistency detected at alter index

    4349

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Inconsistency detected at index usage

    4350

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Transaction already aborted

    4351

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Timeout expired

    Сообщение об ошибке. Timeout/deadlock during index build

    4400

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Status Error in NdbSchemaCon

    4401

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Only one schema operation per schema transaction

    4402

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No schema operation defined before calling execute

    4410

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Schema transaction is already started

    4411

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Schema transaction not possible until upgrade complete

    4412

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Schema transaction is not started

    4501

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Insert in hash table failed when getting table information from Ndb

    4502

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. GetValue not allowed in Update operation

    4503

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. GetValue not allowed in Insert operation

    4504

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. SetValue not allowed in Read operation

    4505

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NULL value not allowed in primary key search

    4506

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Missing getValue/setValue when calling execute

    4507

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Missing operation request when calling execute

    4508

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. GetValue not allowed for NdbRecord defined operation

    4509

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Non SF_MultiRange scan cannot have more than one bound

    4510

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. User specified partition id not allowed for scan takeover operation

    4511

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Blobs not allowed in NdbRecord delete result record

    4512

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Incorrect combination of OperationOptions optionsPresent, extraGet/SetValues ptr and numExtraGet/SetValues

    4513

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Only one scan bound allowed for non-NdbRecord setBound() API

    4514

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Can only call setBound/equal() for an NdbIndexScanOperation

    4515

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Method not allowed for NdbRecord, use OperationOptions or ScanOptions structure instead

    4516

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Illegal instruction in interpreted program

    4517

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Bad label in branch instruction

    4518

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many instructions in interpreted program

    4519

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbInterpretedCode::finalise() not called

    4520

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Call to undefined subroutine

    4521

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Call to undefined subroutine, internal error

    4522

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. setBound() called twice for same key

    4523

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Pseudo columns not supported by NdbRecord

    4524

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbInterpretedCode is for different table

    4535

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attempt to set bound on non key column

    4536

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbScanFilter constructor taking NdbOperation is not supported for NdbRecord

    4537

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Wrong API. Use NdbInterpretedCode for NdbRecord operations

    4538

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbInterpretedCode instruction requires that table is set

    4539

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbInterpretedCode not supported for operation type

    4540

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attempt to pass an Index column to createRecord. Use base table columns only

    4542

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Unknown partition information type

    4543

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Duplicate partitioning information supplied

    4544

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Wrong partitionInfo type for table

    4545

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid or Unsupported PartitionInfo structure

    4546

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Explicit partitioning info not allowed for table and operation

    4547

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. RecordSpecification has overlapping offsets

    4548

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. RecordSpecification has too many elements

    4549

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. getLockHandle only supported for primary key read with a lock

    4550

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot releaseLockHandle until operation executed

    4551

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbLockHandle already released

    4552

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbLockHandle does not belong to transaction

    4553

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbLockHandle original operation not executed successfully

    4554

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbBlob can only be closed from Active state

    4555

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. NdbBlob cannot be closed with pending operations

    4556

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. RecordSpecification has illegal value in column_flags

    4557

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Column types must be identical when comparing two columns

    4600

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Transaction is already started

    4601

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Transaction is not started

    4602

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. You must call getNdbOperation before executeScan

    4603

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. There can only be ONE operation in a scan transaction

    4604

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. takeOverScanOp, to take over a scanned row one must explicitly request keyinfo on readTuples call

    4605

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. You may only call readTuples() once for each operation

    4607

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. There may only be one operation in a scan transaction

    4608

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. You can not takeOverScan unless you have used openScanExclusive

    4609

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. You must call nextScanResult before trying to takeOverScan

    4707

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many event have been defined

    4708

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Event name is too long

    4709

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Can't accept more subscribers

    4710

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Event not found

    4711

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Creation of event failed

    4712

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Stopped event operation does not exist. Already stopped?

    4713

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Column defined in event does not exist in table

    4714

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX do not exist

    4715

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats for specified index do not exist

    4716

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats methods usage error

    4717

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats cannot allocate memory

    4718

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Index stats samples data or memory cache is invalid

    4719

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Index stats internal error

    4720

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX partly missing or invalid

    4721

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Mysqld: index stats thread not open for requests

    4722

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Mysqld: index stats entry unexpectedly not found

    4723

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Mysqld: index stats request ignored due to recent error

    4724

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Mysqld: index stats request aborted by stats thread

    4725

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stats were deleted by another process

    4731

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Event not found

    488

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many active scans

    489

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of scan records in LQH, increase SharedGlobalMemory

    490

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many active scans

    499

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Scan take over error, restart scan transaction

    5024

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Timeout expired

    Сообщение об ошибке. Time-out due to node shutdown not starting in time

    5025

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Timeout expired

    Сообщение об ошибке. Time-out due to node shutdown not completing in time

    623

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. 623

    624

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. 624

    625

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of memory in Ndb Kernel, hash index part (increase DataMemory)

    626

    Ошибка MySQL. HA_ERR_KEY_NOT_FOUND

    Тип ошибки NDB. No data found

    Сообщение об ошибке. Tuple did not exist

    630

    Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Tuple already existed when attempting to insert

    631

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Scan take over error, restart scan transaction

    632

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 632

    633

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Table fragment hash index has reached maximum possible size

    640

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Too many hash indexes (should not happen)

    677

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. Index UNDO buffers overloaded (increase UndoIndexBuffer)

    701

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. System busy with other schema operation

    702

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal temporary

    Сообщение об ошибке. Request to non-master

    703

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid table format

    704

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Attribute name too long

    705

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Table name too long

    706

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Inconsistency during table creation

    707

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No more table metadata records (increase MaxNoOfTables)

    708

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No more attribute metadata records (increase MaxNoOfAttributes)

    709

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No such table existed

    710

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Internal: Get by table name not supported, use table id.

    711

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. System busy with node restart, schema operations not allowed

    712

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No more hashmap metadata records

    720

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Attribute name reused in table definition

    721

    Ошибка MySQL. HA_ERR_TABLE_EXIST

    Тип ошибки NDB. Schema object already exists

    Сообщение об ошибке. Schema object with given name already exists

    723

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. No such table existed

    736

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported array size

    737

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Attribute array size too big

    738

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Record too big

    739

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported primary key length

    740

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Nullable primary key not supported

    741

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported alter table

    743

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported character set in table or index

    744

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Character string is invalid for given character set

    745

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Distribution key not supported for char attribute (use binary attribute)

    746

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema object already exists

    Сообщение об ошибке. Event name already exists

    747

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of event records

    748

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Busy during read of event table

    749

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Primary Table in wrong state

    750

    Ошибка MySQL. IE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid file type

    751

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of file records

    752

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid file format

    753

    Ошибка MySQL. IE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid filegroup for file

    754

    Ошибка MySQL. IE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid filegroup version when creating file

    755

    Ошибка MySQL. HA_MISSING_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid tablespace

    756

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Index on disk column is not supported

    757

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Varsize bitfield not supported

    758

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Tablespace has changed

    759

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid tablespace version

    760

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. File already exists,

    761

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unable to drop table as backup is in progress

    762

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unable to alter table as backup is in progress

    763

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. DDL is not supported with mixed data-node versions

    764

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid extent size

    765

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of filegroup records

    766

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Cant drop file, no such file

    767

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Cant drop filegroup, no such filegroup

    768

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Cant drop filegroup, filegroup is used

    769

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Drop undofile not supported, drop logfile group instead

    770

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Cant drop file, file is used

    771

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Given NODEGROUP doesn't exist in this cluster

    772

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Given fragmentType doesn't exist

    773

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of string memory, please modify StringMemory config parameter

    774

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid schema object for drop

    775

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Create file is not supported when Diskless=1

    776

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index created on temporary table must itself be temporary

    777

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Cannot create a temporary index on a non-temporary table

    778

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. A temporary table or index must be specified as not logging

    779

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid undo buffer size

    780

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many schema transactions

    781

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid schema transaction key from NDB API

    782

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid schema transaction id from NDB API

    783

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Too many schema operations

    784

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Invalid schema transaction state

    785

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Schema object is busy with another schema transaction

    786

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Node Recovery error

    Сообщение об ошибке. Schema transaction aborted due to node-failure

    787

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal temporary

    Сообщение об ошибке. Schema transaction aborted

    788

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Missing schema operation at takeover of schema transaction

    789

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Logfile group not found

    790

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Invalid hashmap

    791

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Too many total bits in bitfields

    792

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Default value for primary key column not supported

    793

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Object definition too big

    794

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Schema feature requires data node upgrade

    795

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Out of LongMessageBuffer in DICT

    796

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Out of schema transaction memory

    797

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Function not implemented

    Сообщение об ошибке. Wrong fragment count for fully replicated table

    798

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. A disk table must not be specified as no logging

    799

    Ошибка MySQL. HA_WRONG_CREATE_OPTION

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Non default partitioning without partitions

    805

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of attrinfo records in tuple manager, increase LongSignalMemory

    809

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 809

    812

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 812

    823

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too much attrinfo from application in tuple manager

    826

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Too many tables and attributes (increase MaxNoOfAttributes or MaxNoOfTables)

    827

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of memory in Ndb Kernel, table data (increase DataMemory)

    829

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Corrupt data received for insert/update

    830

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of add fragment operation records

    831

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many nullable/bitfields in table definition

    833

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 833

    839

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Illegal null attribute

    840

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL

    850

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too long or too short default value

    851

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Fixed-size column offset exceeded max.Use VARCHAR or COLUMN_FORMAT DYNAMIC for memory-stored columns

    871

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 871

    873

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, ordered index data (increase SharedGlobalMemory)

    874

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too much attrinfo (e.g. scan filter) for scan in tuple manager

    876

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. 876

    877

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. 877

    878

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. 878

    879

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. 879

    880

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Tried to read too much - too many getValue calls

    881

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unable to create table, out of data pages (increase DataMemory)

    882

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 882

    883

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 883

    884

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Stack overflow in interpreter

    885

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Stack underflow in interpreter

    886

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. More than 65535 instructions executed in interpreter

    887

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 887

    888

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 888

    889

    Ошибка 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)

    890

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. 890

    891

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Overload error

    Сообщение об ошибке. Data UNDO buffers overloaded (increase UndoDataBuffer)

    892

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Unsupported type in scan filter

    893

    Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY

    Тип ошибки NDB. Constraint violation

    Сообщение об ошибке. Constraint violation e.g. duplicate value in unique index

    896

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Tuple corrupted - wrong checksum or column data in invalid format

    897

    Ошибка 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)

    899

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Rowid already allocated

    901

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Inconsistent ordered index. The index needs to be dropped and recreated

    902

    Ошибка MySQL. HA_ERR_RECORD_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of memory in Ndb Kernel, ordered index data (increase DataMemory)

    903

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Too many ordered indexes (increase MaxNoOfOrderedIndexes)

    904

    Ошибка MySQL. HA_ERR_INDEX_FILE_FULL

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of fragment records (increase MaxNoOfOrderedIndexes)

    905

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Out of attribute records (increase MaxNoOfAttributes)

    906

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported attribute type in index

    907

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Unsupported character set in table or index

    908

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Insufficient space

    Сообщение об ошибке. Invalid ordered index tree node size

    909

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, ordered scan operation (increase SharedGlobalMemory)

    910

    Ошибка MySQL. HA_ERR_NO_SUCH_TABLE

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Index is being dropped

    911

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Schema error

    Сообщение об ошибке. Index stat scan requested on index with unsupported key size

    912

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index stat scan requested with wrong lock mode

    913

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid index for index stats update

    914

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid index stats request

    915

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. No free index stats op

    916

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid index stats sys tables

    917

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Internal error

    Сообщение об ошибке. Invalid index stats sys tables data

    918

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Cannot prepare index stats update

    919

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Cannot execute index stats update

    920

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Row operation defined after refreshTuple()

    921

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, copy tuples (increase SharedGlobalMemory)

    923

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of UNDO buffer memory (increase UNDO_BUFFER_SIZE)

    924

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, stored procedure record (increase SharedGlobalMemory)

    925

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, tup scan operation (increase SharedGlobalMemory)

    926

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Temporary Resource error

    Сообщение об ошибке. Out of transaction memory in local data manager, acc scan operation (increase SharedGlobalMemory)

    INVALID_BLOCK_NAME

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid block name

    INVALID_ERROR_NUMBER

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid error number. Should be >= 0.

    INVALID_TRACE_NUMBER

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Invalid trace number.

    NODE_NOT_API_NODE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. The specified node is not an API node.

    NODE_SHUTDOWN_IN_PROGESS

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Node shutdown in progress

    NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Node shutdown would cause system crash

    NO_CONTACT_WITH_DB_NODES

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No contact with database nodes }

    NO_CONTACT_WITH_PROCESS

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. No contact with the process (dead ?).

    OPERATION_NOT_ALLOWED_START_STOP

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Operation not allowed while nodes are starting or stopping.

    QRY_BATCH_SIZE_TOO_SMALL

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Batch size for sub scan cannot be smaller than number of fragments.

    QRY_CHAR_OPERAND_TRUNCATED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Character operand was right truncated

    QRY_CHAR_PARAMETER_TRUNCATED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Character Parameter was right truncated

    QRY_DEFINITION_TOO_LARGE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Query definition too large.

    QRY_EMPTY_PROJECTION

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Query has operation with empty projection.

    QRY_HAS_ZERO_OPERATIONS

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Query defintion should have at least one operation.

    QRY_ILLEGAL_STATE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Query is in illegal state for this operation.

    QRY_IN_ERROR_STATE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. A previous query operation failed, which you missed to catch.

    QRY_MULTIPLE_PARENTS

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Multiple 'parents' specified in linkedValues for this operation

    QRY_MULTIPLE_SCAN_SORTED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Query with multiple scans may not be sorted.

    QRY_NUM_OPERAND_RANGE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Numeric operand out of range

    QRY_OPERAND_ALREADY_BOUND

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Can't use same operand value to specify different column values

    QRY_OPERAND_HAS_WRONG_TYPE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Incompatible datatype specified in operand argument

    QRY_PARAMETER_HAS_WRONG_TYPE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Parameter value has an incompatible datatype

    QRY_REQ_ARG_IS_NULL

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Required argument is NULL

    QRY_RESULT_ROW_ALREADY_DEFINED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Result row already defined for NdbQueryOperation.

    QRY_SCAN_ORDER_ALREADY_SET

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Index scan order was already set in query definition.

    QRY_SEQUENTIAL_SCAN_SORTED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Parallelism cannot be restricted for sorted scans.

    QRY_TOO_FEW_KEY_VALUES

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. All required 'key' values was not specified

    QRY_TOO_MANY_KEY_VALUES

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Too many 'key' or 'bound' values was specified

    QRY_UNKNOWN_PARENT

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Unknown 'parent' specified in linkedValue

    QRY_UNRELATED_INDEX

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Specified 'index' does not belong to specified 'table'

    QRY_WRONG_INDEX_TYPE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Wrong type of index specified for this operation

    QRY_WRONG_OPERATION_TYPE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. This method cannot be invoked on this type of operation (lookup/scan/index scan).

    SEND_OR_RECEIVE_FAILED

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Send to process or receive failed.

    SYSTEM_SHUTDOWN_IN_PROGRESS

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. System shutdown in progress

    UNSUPPORTED_NODE_SHUTDOWN

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. Unsupported multi node shutdown. Abort option required.

    WRONG_PROCESS_TYPE

    Ошибка MySQL. DMEC

    Тип ошибки NDB. Application error

    Сообщение об ошибке. The process has wrong type. Expected a DB process.

    2.4.4. Классификации ошибок NDB

    В следующей таблице перечислены классификационные коды, используемые для ошибок 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.

    2.5. Примеры NDB API

    Эта секция обеспечивает примеры кода, иллюстрирующие, как выполнить некоторые основные задачи, используя 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.

    2.5.1. Пример NDB API, использующий синхронные транзакции

    Этот пример иллюстрирует использование синхронных транзакций в API NDB. Это сначала создает базу данных ndb_examples и таблицу api_simple (если эти объекты еще не существуют) с использованием MySQL C API с узлом SQL и выполняет ряд операций по исходным данным (вставка, обновление, чтение и выбор) на этой таблице, используя API NDB.

    Собранная программа берет два аргумента:

    1. Путь к файлу сокета MySQL (mysqld опция --socket)

    2. Строка подключения кластера 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);
      }
    }
    

    2.5.2. Пример NDB API, использующий синхронные транзакции и много кластеров

    Этот пример демонстрирует синхронные транзакции и соединение с многократными кластерами в единственном приложении 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).

    2.5.3. Пример NDB API: ошибки из-за неправильного обращения и повторение транзакций

    Эта программа демонстрирует ошибки из-за неправильного обращения и повторение неудавшихся транзакций, используя API NDB.

    Исходный код для этого примера может быть найден в файле storage/ndb/ndbapi-examples/ndbapi_retries/ndbapi_retries.cpp в дереве исходных текстов NDB Cluster.

    Есть много путей в программе, используя API NDB. В этом примере мы выполняем две вставки в той же самой транзакции, используя NdbTransaction::execute(NoCommit).

    В приложениях API NDB есть два типа неудач, которые будут приняты во внимание:

    1. Сбои транзакции: Если непостоянные, они могут быть обработаны, повторно выполнив транзакцию.

    2. Ошибки приложения: Они обозначаются 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;
    }
    

    2.5.4. NDB API: основной пример просмотра

    Этот пример иллюстрирует, как использовать просмотр в NDB API. Это показывает, как выполнить просмотр, как просмотреть для обновления и как просмотреть для удаления, использовав классы NdbScanFilter и NdbScanOperation.

    Исходный код для этого примера может найден в исходном дереве NDB Cluster в файле storage/ndb/ndbapi-examples/ndbapi_scan/ndbapi_scan.cpp.

    Этот пример использует следующие классы и методы:

    /*
     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;
    }
    

    2.5.5. Пример NDB API: использование вторичных индексов в просмотрах

    Эта программа иллюстрирует, как использовать вторичные индексы в 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;
    }
    

    2.5.6. Пример NDB API: использование NdbRecord с хэш-индексами

    Эта программа иллюстрирует, как использовать вторичные индексы в 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;
    }
    

    2.5.7. Пример NDB API, сравнивающий RecAttr и NdbRecord

    Этот пример иллюстрирует основные отличия между 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";
    }
    

    2.5.8. Пример обработки событий NDB API

    Этот пример демонстрирует обработку событий 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;
    }
    

    2.5.9. Пример NDB API: базовая обработка BLOB

    Этот пример иллюстрирует манипуляцию столбцом 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;
    }
    

    2.5.10. Пример NDB API: обработка столбцов BLOB и значений, используя NdbRecord

    Этот пример иллюстрирует манипуляцию столбцом 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;
    }
    

    2.5.11. Пример простого массива в NDB API

    Эта программа вставки данных столбцов 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).

    2.5.12. Пример простого массива NDB API, используя адаптер

    Эта программа вставляет столбцы 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 &lt;NdbApi.hpp&gt;
    #include &lt;iostream&gt;
    #include &lt;vector&gt;
    #include &lt;cstdlib&gt;
    #include &lt;cstring&gt;
    
    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).

    2.5.13. Пример Timestamp2

    Файл 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;
    }
    

    2.5.14. Общие файлы для примеров множества NDB API

    В 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: Предоставляет метод для создания последовательностей произвольной длины.

    Далее приведены исходные тексты для этих файлов.

    array_adapter.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
    

    error_handling.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
    

    ndb_util.hpp

    #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
    

    util.hpp

    #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
    

    Поиск

     

    Найди своих коллег!

    Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru