WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Резюме Эта глава содержит информацию о API NDB, который используется, чтобы
написать приложения, работающие с данными в
Эта секция обсуждает приготовления, необходимые для написания и
компилирования приложения API NDB. Резюме Эта секция предоставляет информацию о компилировании и компоновке
приложения NDB API, включая требования и варианты компоновщика и компилятора.
Чтобы использовать API NDB с MySQL, вы должны иметь библиотеку клиента
Это руководство предназначено для использования с MySQL
NDB Cluster 7.2 и выше. Заголовочные файлы. Чтобы собрать исходные файлы, которые
используют API NDB, необходимо гарантировать, что необходимые заголовочные
файлы могут быть найдены. Заголовочные файлы, определенные для NDB и MGM API,
устанавливаются в следующих подкаталогах MySQL
Флаги компилятора. MySQL-определенные необходимые флаги компилятора
могут быть определены, используя утилиту
mysql_config,
которая является частью установки MySQL: Это устанавливает путь включения для заголовочных файлов MySQL, но не для
определенных для API NDB. Опция
Необходимо добавить пути подкаталога явно, чтобы добавление всего
необходимого собрало флаги к переменной оболочки Если вы не намереваетесь использовать функции управления NDB Cluster,
последняя строка в предыдущем примере может быть опущена. Однако, если вы
интересуетесь только функциями управления и не хотите получить доступ к
данным NDB Cluster кроме как из MySQL, тогда можно опустить строку,
ссылающуюся на каталог Приложения NDB API должны быть скомпонованы с библиотеками клиента MySQL и
Необходимые флаги компоновщика для библиотеки клиента MySQL возвращены
mysql_config
Теперь необходимо только добавить Это часто быстрее и более просто использовать автоинструменты GNU, чем
написать ваши собственные make-файлы. В этой секции мы обеспечиваем макрос
autoconf
Все примеры в этой главе включают общий файл
automake
также требует, чтобы вы обеспечили файлы
Чтобы создать все необходимые файлы, скомандуйте: Обычно это должно быть сделано только однажды, после чего
make
приспосабливает любые изменения файла. Пример 1-1: acinclude.m4. Пример 1-2: configure.in. Пример 1-3: Makefile.am. Пример 1-4: WITH_MYSQL для включения в acinclude.m4. Резюме Эта секция показывает подключение к NDB Cluster. Приложения NDB API требуют один или больше включаемых файлов: Приложения, получающие доступ к данным NDB Cluster через NDB API,
должны включать файл Приложения, использующие клиентский MySQL API, а также API NDB, должны
также включать Для приложений, которые используют функции управления NDB Cluster из
MGM API нужен файл Перед использованием API NDB это должно сначала быть инициализировано
вызовом функции Как только применение API NDB завершено, можно вызвать
Каждая из функций Должно быть возможно использовать Чтобы установить связь с сервером, необходимо создать экземпляр
Связь кластера на самом деле не начинается до вызова метода
По умолчанию узел API соединяется с ближайшим
узлом данных. Это обычно узел данных на той же самой машине как самый
близкий вследствие того, что транспортировка общей памяти может
использоваться вместо медленного TCP/IP. Это может привести к плохому
распределению нагрузки в некоторых случаях, таким образом, возможно провести
в жизнь циклическую схему связи узла, вызывая метод
В следующем примере инициализация и связь обработаны в двух функциях
Пример 2-1: Пример связи. Резюме Следующие две секции обсуждают обозначение и другие соглашения,
сопровождаемые API NDB относительно объектов базы данных MySQL, а
также обработку типов данных MySQL в приложениях API NDB. Эта секция обсуждает отображение объектов базы данных MySQL к API NDB. Базы данных и схемы. Базы данных и схемы
не представляются объектами как таковыми в API NDB. Вместо этого они
смоделированы как признаки объектов
Таблицы. Имена таблиц MySQL непосредственно отображены к
именам таблиц Индексы. Есть два типа индексов NDB: Hash indexes уникальны,
но не сортированы. B-tree indexes сортированы, но
разрешают двойные значения. Названия уникальных индексов и первичных ключей
обработаны следующим образом: Для MySQL индекс Для первичного ключа MySQL создается только индекс B-tree.
Этому индексу дают имя Имена столбцов и значения. Имена столбцов Эта секция предоставляет информацию о пути, которым типы данных MySQL
представляются в столбцах таблицы NDBCLUSTER
и как к этим значениям можно получить доступ в приложениях NDB API. Типы числовых данных. Типы данных MySQL
Типы данных MySQL
Типы символьных данных. Пространство памяти для столбцов MySQL
Значение столбца Можно использовать эту функцию как показано здесь: См. раздел 2.5.11
для полного примера программы, который пишет и читает значения
Требования хранения MySQL для столбцов
Для колонок в памяти
Для дисковых столбцов данных
Каждая строка в столбце NDB Cluster
256 байт, если Временные типы данных. Хранение временных типов в API NDB зависит
от того, используются ли старые типы MySQL
без долей секунды или новые типы с поддержкой доли
секунды. Поддержка долей секунды была введена в MySQL 5.6, а также версиях
NDB Cluster на основе его, то есть NDB 7.3 и NDB 7.4.
Эти версии используют новые временные типы по умолчанию, но могут
использовать старые, запуская
mysqld с опцией
Поскольку поддержка старых временных типов будет удалена
в будущем выпуске, вы поощряетесь мигрировать любые таблицы, используя старые
временные типы для новых версий этих типов. Можно сделать это, выполнив
Вы видите, использует ли данная таблица старые или новые временные
типы, проверяя вывод
ndb_desc,
поставляемой с NDB Cluster. Считайте таблицу, созданную в базе данных
Соответствующая часть (блок Названия новых временных типов MySQL имеют суффикс с
Вывод от выполнения
ndb_desc
на этой таблице включает блок Затронутые типы MySQL:
Для части доли секунды каждого из этих типов точность затрагивает число
необходимых байтов, как показано в следующей таблице: Таблица 2.1. Точность новых временных типов NDB API Дробная часть для каждого из новых временных типов сохранена в формате с
обратным порядком байтов, то есть, с самым старшим байтом в начале. Двоичные расположения старых и новых версий этих типов описаны в
следующих нескольких параграфах. Бит 23 служит знаковым битом, если этот бит установлен, временное
значение считают отрицательным. Таблица 2.2. Кодирование Time2 Любые дробные байты в дополнение к этому обработаны, как описано ранее.
Таблица 2.3. Кодирование Date Таблица 2.4. Кодирование DateTime2 Биты Дополнительная информация. Больше информации и примеров
как выражены в API NDB типы данных можно найти в
Эта секция предоставляет иерархический список всех классов, интерфейсов и
структур, выставленных API NDB. Эта секция предоставляет подробный список всех классов, интерфейсов и
структур, определенных в Каждый листинг включает следующую информацию: Описание и цель класса, интерфейса или структуры. Указатели, когда это применимо, к родительским и дочерним классам.
Подробные списки всех публичных членов, включая описания всех
параметров методов и типов значений. Класс, интерфейс и описания структуры обеспечиваются в алфавитном
порядке. Для иерархического листинга посмотрите
раздел 2.2. Резюме Эта секция описывает структуру
Родительский класс.
Описание.
Методы.
Таблица 2.5. NdbDictionary::AutoGrowSpecification Резюме Этот класс представляет колонку в таблице NDB Cluster. Родительский класс.
Дочерние классы.
Нет Описание. Каждый экземпляр Встроенный тип Длина массива или максимальная длина Точность и масштаб (
в настоящее время не применяется) Набор символов (применим только к столбецм, используя
строковые типы данных Размеры частей (применим только к столбцам
Эти типы в целом соответствуют типам данных MySQL и их вариантам.
Форматы данных те же самые, как в MySQL. API NDB не оказывает поддержки для
создания таких форматов, однако, они проверяются ядром
Методы. В следующей таблице перечислены публичные методы этого
класса и цели использования каждого метода: Таблица 2.6. Для подробных описаний и примеров использования для каждого из этих
методов см. раздел 2.3.2.4. Столбцы, созданные этим классом, невидимы для MySQL Server.
Это означает, что к ним не могут получить доступ клиенты MySQL, и что они не
могут копироваться. По этим причинам часто предпочтительно
избежать работать с ними. В NDB API имена столбцов обработаны чувствительным к регистру способом.
Это отличается от MySQL C API. Чтобы уменьшить возможность для ошибки,
рекомендуется, чтобы вы последовательно называли все колонки, используя
верхний регистр или строчные буквы. Типы. Это публичные типы класса
Таблица 2.7. Резюме Этот тип описывает внутренний формат признака
Описание. Формат хранения признака может быть
фиксированным или переменным. Возможные значения. Возможные значения показывают с
описаниями в следующей таблице: Таблица 2.8. Фиксированный формат хранения быстрее, но также
обычно требует большего количества пространства, чем переменный формат.
По умолчанию Резюме Этот тип описывает тип хранения, используемый объектом
Описание. Тип хранения, используемый для данной колонки, может быть
в памяти или на диске. Колонки, сохраненные на диске, означают, что меньше
RAM требуется в целом, но такие колонки не могут быть внесены в индекс и
потенциально намного медленнее по доступу. Умолчание
Возможные значения. Таблица 2.9. Резюме Описание. Типы данных для объектов
Возможные значения. Таблица 2.10. Начиная с NDB 7.3.1, NDB API обеспечивает доступ к типам времени с
микросекундами, добавленными в MySQL 5.6
(
Не путайте Резюме Эта секция документирует публичные методы класса
Оператор присваивания ( Как с другими объектами базы данных, создание объекта
Также помните, что API NDB обращается с именами столбцов
чувствительным к регистру способом. Описание. Можно создать новый
API NDB обращается с именами столбцов чувствительным к регистру способом.
Например, если вы создадите колонку, названную
myColumn, вы не будете в состоянии получить доступ
к ней позже, используя имя Mycolumn.
Можно уменьшить возможность для ошибки, назвав все колонки последовательно,
используя только какой-то один регистр. Сигнатура. Можно создать любой новый экземпляр класс
Конструктор для нового
Конструктор копии: Параметры. Создавая новый экземпляр
Возвращаемое значение.
Объект Деструктор.
Деструктор класса Описание. Этот метод используется, чтобы сравнить
Сигнатура. Параметры. Возвращаемое значение.
Описание. Этот метод получает тип массива колонки. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Это вернет набор символов столбца. Этот метод применим только к столбецм, чей
NDB APIобращается с именами столбцов чувствительным к регистру способом,
myColumn и Mycolumn
это разные столбцы. Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на структуру
Описание. Этот метод получает порядковый номер колонки в рамках ее
таблицы или индекса. Если столбец часть индекса (такой как тогда, когда
возвращено Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер столбца как integer. Описание. Получает данные о значении столбца по умолчанию. Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по
умолчанию, надо использовать
Сигнатура. Параметры.
Возвращаемое значение. Данные о значении по умолчанию. Описание. Этот метод получает действующий размер
Этот метод применим только к столбцам Сигнатура. Параметры. Нет. Возвращаемое значение. Действующий размер колонки
Описание. Этот метод получает длину колонки. Это длина массива
для колонки или максимальная длина для множества переменной длины. Сигнатура. Параметры.
Нет. Возвращаемое значение. Максимальная длина массива
колонки как integer. Описание. Этот метод возвращает название колонки, для
которой его вызывают. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название колонки. Описание. Этот метод используется, чтобы определить, может ли
столбец быть установлен в Сигнатура. Параметры.
Нет. Возвращаемое значение. Описание. Этот метод используется, чтобы проверить, является ли
столбец частью ключа разделения таблицы. Ключ разделения это ряд признаков,
используемых, чтобы распределить кортежи на узлы данных. Этот ключ это
хеш-функция, определенная для Примером, где это было бы полезно, является применение отслеживания
ресурсов, включающее многократные склады и регионы, где могло бы быть хорошо
использовать ID склада и id округа как ключ разделения. Это поместило бы все
данные для определенного района и склада в том же самом узле хранения.
В местном масштабе к каждому фрагменту полный первичный ключ будет все еще
использоваться с алгоритмом хеширования в таком случае. Для получения дополнительной информации о разделении, схемы выделения
разделов и разделении ключей в MySQL см.
Partitioning в MySQL Manual. Единственный тип определенного пользователями разделения, которое
поддерживается для использования с
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы получить размер части
Этот метод применим только к столбцам
Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер части колонки как integer.
В случае Описание. Этот метод получает точность колонки. Этот метод применим только к десятичным столбецам. Сигнатура. Параметры.
Нет. Возвращаемое значение. Точность колонки как integer.
Точность определяется как количество значащих цифр, для получения
дополнительной информации посмотрите обсуждение типа данных
Описание. Этот метод используется, чтобы определить, является ли
столбец частью первичного ключа таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. Описание. Этот метод вернет масштаб для
десятичного значения столбца. Этот метод применим только к десятичным столбцам. Сигнатура. Параметры.
Нет. Возвращаемое значение. Масштаб десятичной колонки как integer.
Масштаб десятичной колонки представляет количество цифр, которые могут быть
сохранены после десятичной точки. Для этого значения возможно быть
Описание. Эта функция используется, чтобы получить размер колонки.
Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер колонки в байтах (integer). Описание. Получает пространство, требуемое для данной колонки
Для BLOB это значение совпадает с
Для столбцов всех других типов это совпадает со значением,
возвращенным
Этот метод был добавлен в NDB 7.3.10 и NDB 7.4.7. Сигнатура. Параметры.
Нет. Возвращаемое значение. integer. Описание. Этот метод получает тип хранения колонки. Сигнатура. Параметры.
Нет. Возвращаемое значение. Значение Описание. Этот метод получает размер полосы
Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер полосы колонки как integer. Описание. Этот метод получает тип данных колонки. Сигнатура. Параметры.
Нет. Возвращаемое значение. Описание. Устанавливает тип массива для колонки. Сигнатура. Параметры. Значение
Возвращаемое значение.
Нет. Описание. Этот метод может использоваться, чтобы установить набор
символов и сопоставление столбца типа Этот метод применим только к столбцам
Изменения, внесенные в колонки, используя этот метод, невидимы в MySQL.
Сигнатура. Параметры. Этот метод берет один параметр.
Возвращаемое значение.
Нет. Описание. Этот метод устанавливает значение столбца в его
умолчание, если он у него есть, иначе это устанавливает колонку в
Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по
умолчанию, надо использовать
Сигнатура. Параметры. Этот метод берет 2 аргумента: указатель
Возвращаемое значение. 0 на успехе, 1 на неудаче. Описание. Этот метод получает действующий размер
Этот метод применим только к Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. integer Возвращаемое значение.
Нет. Описание. Этот метод устанавливает длину колонки.
Для множества переменной длины это максимальная длина, иначе
это длина массива. Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Этот метод берет отдельный аргумент integer
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы определить имя колонки.
Сигнатура. Параметры. Этот метод берет отдельный аргумент
новое название колонки. Возвращаемое значение.
Нет. Описание. Этот метод переключает возможность столбца хранить null.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Возвращаемое значение.
Нет. Описание. Этот метод позволяет добавить колонку к ключу разделения
таблицы, к которой это принадлежит, или удалить колонку из
ключа разделения таблицы. Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Для получения дополнительной информации посмотрите
раздел 2.3.2.4.11. Сигнатура. Параметры. Единственный параметр
Возвращаемое значение.
Нет. Описание. Этот метод устанавливает размер части
Этот метод применим только к Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. integer Возвращаемое значение.
Нет. Описание. Этот метод может использоваться, чтобы установить
точность десятичной колонки. Этот метод применим только к десятичным столбцам. Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Этот метод берет единственный параметр: целое число,
значение новой точности колонки. Для получения дополнительной информации о
десятичной точности и масштабе, посмотрите разделы
2.3.2.4.13 и
2.3.2.4.15. Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы сделать колонку
частью первичного ключа таблицы или удалить ее из первичного ключа. Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Если Возвращаемое значение.
Нет. Описание. Этот метод может использоваться, чтобы установить
масштаб десятичной колонки. Этот метод применим только к десятичным столбцам. Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Этот метод берет единственный параметр integer
Возвращаемое значение.
Нет. Описание. Этот метод устанавливает размер полосы
Этот метод применим только к Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Этот метод берет отдельный аргумент. integer
Возвращаемое значение.
Нет. Описание. Устанавливает тип хранения для колонки. Сигнатура. Параметры. Значение
Возвращаемое значение.
Нет. Описание. Этот метод устанавливает
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL. Сигнатура. Параметры. Этот метод берет единственный параметр
Возвращаемое значение.
Нет. Резюме Эта секция покрывает класс Родительский класс.
Дочерние классы. Нет Описание. Класс В настоящее время только неиндексируемые данные столбца могут храниться на
диске. Индексы и индексированные столбцы сохранены в памяти. NDB Cluster до MySQL 5.1 не поддерживал Disk Data и файлы данных,
таким образом класс Методы. В следующей таблице перечислены публичные
методы этого класса и цели использования каждого метода: Таблица 2.11. Типы.
Класс Описание. Этот метод создает новый экземпляр
Сигнатура. Создать новый экземпляр: Создать копию существующего экземпляра
Параметры. Новый экземпляр:
Нет.
Конструктор копии: ссылка на экземпляр
Возвращаемое значение.
Объект
Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер файла как unsigned 32-bit integer. Описание. Этот метод получает свободное пространство,
доступное в файле данных. Сигнатура. Параметры.
Нет. Возвращаемое значение. Число байтов, свободных в файле данных как
unsigned 64-bit integer. Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры. Нет. Возвращаемое значение. ID узла как unsigned 32-bit integer. Описание. Этот метод используется, чтобы получить идентификатор
объекта файла данных. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта файла
данных как integer. Описание. Этот метод используется, чтобы получить статус
объекта файла данных. Сигнатура. Параметры.
Нет. Возвращаемое значение. Файл данных
Описание. Этот метод получает версию объекта файла данных (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта файла данных как integer. Описание. Этот метод возвращает путь файловой
системы к файлу данных. Сигнатура. Параметры.
Нет. Возвращаемое значение. Путь к файлу данных в файловой системе узла
данных, строка (указатель на символ). Описание. Этот метод получает размер файла данных в байтах. Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер файла данных в байтах как
unsigned 64-bit integer. Описание. Этот метод может использоваться, чтобы получить название
табличного пространства, которому принадлежит файл данных. Можно также получить доступ к ID связанного табличного пространства
непосредственно. Посмотрите
раздел 2.3.3.11. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название связанного табличного пространства.
Описание. Этот метод получает ID табличного пространства, которому
принадлежит файл данных. Можно также получить доступ к названию связанного табличного пространства
непосредственно. Посмотрите
раздел 2.3.3.10. Сигнатура. Параметры.
Нет. Возвращаемое значение. Этот метод возвращает ID табличного
пространства как unsigned 32-bit integer. Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает путь к файлу данных в файловой
системе узла данных. Сигнатура. Параметры. Путь к файлу, строка. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает размер файла данных. Сигнатура. Параметры. Этот метод берет единственный параметр: желаемый размер
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы связать файл
данных с табличным пространством. Сигнатуры. Используя название табличного пространства, как показано здесь: Используя ссылку на объект
Параметры. Этот метод берет единственный параметр, который может быть
одним из следующего: Имя Ссылка Возвращаемое значение.
Нет. Резюме Эта секция описывает класс Родительский класс.
Дочерние классы.
Описание. Это используется для определения и получения
метаданных объекта данных. Это также включает методы для создания и удаления
объектов базы данных. Методы. В следующей таблице перечислены публичные
методы этого класса: Таблица 2.12. Объекты базы данных, такие как таблицы и индексы, созданные с
использованием методов Класс Типы. См. разделы 2.3.14 и
2.3.5. Описание. Этот метод создает новый экземпляр класса
Конструктор и деструктор для этого класса защищенные
методы, а не публичные. Сигнатура. Параметры. Объект
Возвращаемое значение.
Объект Деструктор. Деструктор не берет параметров и ничего не возвращает.
Описание. Начинает транзакцию схемы. Ошибка происходит, если
транзакция уже активна или если ядерные метаданные блокированы.
Можно определить, существует ли уже транзакция схемы, используя метод
Операция по метаданным
происходит каждый раз, когда объекты данных созданы, изменены или удалены,
такая операция может создать дополнительные подоперации в ядре NDB. Объект Также возможно начать и закончить транзакцию схемы явно и выполнить ряд
определенных пользователями операций атомарно в ее границах.
В этом случае все операции в транзакции схемы имеют успех или прерваны и
отменены как единица. Это сделано, выполнив шаги, перечисленные здесь: Чтобы начать транзакцию схемы, вызовите
Выполните желаемые операции (например,
Закончите транзакцию схемы, вызывая
Каждую операцию посылают в ядро NDB, которое разбирает и сохраняет ее.
Неудача разбора приводит к откату к предыдущей пользовательской операции
перед возвратом, в этом пункте пользователь может продолжить или
прервать всю транзакцию. После того, как все операции были представлены,
Если пользователь выходит перед запросом
Сигнатура. Параметры.
Нет. Возвращаемое значение.
0 на успехе, -1 на ошибке. Описание. Этот метод создает новый файл данных, заданный объектом
Сигнатура. Параметры. Отдельный аргумент: ссылка на экземпляр
Возвращаемое значение. 0 на успехе, -1 на ошибке. Описание. Создает событие, учитывая ссылку на объект
Необходимо иметь в виду, что API NDB не отслеживает ассигнованные
объекты-события, что означает, что пользователь должен удалить
Сигнатура. Параметры. Ссылка Возвращаемое значение.
Описание. Создает объект
Сигнатура. Параметры. Ссылка на объект
Возвращаемое значение.
Описание. Создает
Сигнатура. Параметры. Ссылка на хэш-карту и опционально ID, который будет
назначен на нее. Добавлено в NDB 7.2.7. Возвращаемое значение. 0 на успехе, на неудаче
вернет -1 и устанавливает ошибку. Описание. Этот метод создает индекс, заданный экземпляром
Сигнатура. Этот метод может быть вызван с или без ссылки
на объект таблицы: Параметры. Надо: ссылка на
объект Возвращаемое значение.
Описание. Этот метод создает новую группу файла журнала, заданную
экземпляром Сигнатура. Параметры. Отдельный аргумент, ссылка на объект
Возвращаемое значение.
Описание. Этот метод используется, чтобы создать объект
Сигнатура. Вызов этого метода зависит от того, должна ли
получающаяся NdbRecord использоваться в операциях по индексу или таблице: Чтобы создать
Чтобы создать
или Параметры.
Если Указатель на объект
Длина Возвращаемое значение.
Пример.
См. раздел 2.3.27. Описание. Составляет таблицу, используя данный экземпляр
Таблицы, созданные с использованием этого метода, не могут быть видны
MySQL Server, не могут быть обновлены клиентами MySQL и
не могут копироваться. Сигнатура. Параметры. Экземпляр
Возвращаемое значение.
Описание. Этот метод создает новое табличное пространство, заданное
объектом Сигнатура. Параметры. Этот метод требует отдельного аргумента: ссылки на
экземпляр
Возвращаемое значение.
Описание. Этот метод создает новый файл отмен, заданный объектом
Сигнатура. Параметры. Этот метод требует одного аргумента: ссылки на экземпляр
Возвращаемое значение.
Описание. Этот метод удаляет файл данных, заданный объектом
Сигнатура. Параметры. Отдельный аргумент: ссылка на экземпляр
Возвращаемое значение.
Описание. Этот метод удаляет событие учитывая ссылку на объект
Сигнатура. Параметры. Этот метод берет два параметра: По умолчанию Возвращаемое значение.
Описание. Этот метод удаляет внешний ключ учитывая ссылку на
объект Сигнатура. Параметры. Ссылка на удаляемый объект
Возвращаемое значение.
Описание. Этот метод удаляет индекс, переданный экземпляром
Сигнатура. Параметры. Этот метод берет два параметра, один
из которых дополнительный: Возвращаемое значение.
Описание. Берет экземпляр
Сигнатура. Параметры. Отдельный аргумент, ссылка на объект
Возвращаемое значение.
Описание. Удаляет таблицу, заданную экземпляром
Сигнатура. В NDB 7.3.5 и позже этот метод пропускает все ограничения внешнего ключа
на До NDB 8.0.17 таблица Параметры. Экземпляр
Возвращаемое значение.
Описание. Этот метод удаляет табличное пространство, заданное
объектом
Сигнатура. Параметры. Этот метод требует отдельного аргумента:
ссылки на экземпляр
Возвращаемое значение.
Описание. Этот метод удаляет файл отката, заданный объектом
Сигнатура. Параметры. Этот метод требует один аргумент: ссылку на экземпляр
Возвращаемое значение.
Описание. Заканчивает транзакцию схемы, начатую
Как со многими другими методами API NDB, возможно для
Сигнатура. Параметры. Флаги определяют, как законченная транзакция обработана.
По умолчанию 0 заставляет транзакцию быть переданной.
Dictionary::SchemaTransFlag. Можно также использовать с
Возвращаемое значение.
0 при удаче, в случае ошибки -1 и установит код ошибки
Описание. Этот метод используется, чтобы получить объект
Сигнатура. Параметры. Этот метод должен быть вызван, используя два аргумента,
как показано здесь: 32-bit unsigned integer Возвращаемое значение. Объект
Описание. Получите хэш-карту таблицы по умолчанию. Добавлен в NDB 7.2.7. Сигнатура. или Возвращаемое значение.
0 при успехе, при неудаче -1 и установит ошибку. Описание. Этот метод используется, чтобы получить новый объект
NDB API не отслеживает ассигнованные объекты-события, что означает, что
пользователь должен удалить каждый
Сигнатура. Параметры. Строка Возвращаемое значение. Указатель на объект
Описание. Этот метод используется, чтобы получить новый объект
Сигнатура. Параметры. Ссылка на внешний ключ и
Возвращаемое значение. Указатель на объект
Описание. Получает хэш-карту по имени или таблице. Добавлено в NDB 7.2.7. Сигнатура. или Параметры. Ссылка на хэш-карту и имя или на
Возвращаемое значение.
0 при успехе, при ошибке -1 и установит ошибку. Описание. Этот метод получает указатель на индекс, учитывая
название индекса и название таблицы, которой принадлежит индекс. Сигнатура. Параметры. Требуются два параметра: Название индекса ( Название таблицы, которой принадлежит индекс
( Оба это строковые значения, представленные указателями на символ. Возвращаемое значение. Указатель на
Описание.
Этот метод получает объект
Сигнатура. Параметры. Имя Возвращаемое значение.
Экземпляр
Описание. Этот метод получает ошибку
Сигнатура. Параметры.
Нет. Возвращаемое значение. Ссылка на объект
Описание. Этот метод может использоваться, чтобы получить доступ к
таблице с известным именем. Посмотрите
раздел 2.3.37. Сигнатура. Параметры. Имя Возвращаемое значение. Указатель на таблицу или
Описание. Учитывая имя или ID табличного пространства, этот метод
возвращает объект
Сигнатуры. Этот метод может быть вызван любым из этих способов: Используя имя табличного пространства: Используя ID табличного пространства: Параметры. Любой из следующего: unsigned 32-bit integer Возвращаемое значение. Объект
Описание. Этот метод получает объект
Сигнатура. Параметры. Этот метод требует следующих двух аргументов: Возвращаемое значение.
Экземпляр Описание. Говорит, продолжается ли транзакция схемы API NDB. Сигнатура. Параметры.
Нет. Возвращаемое значение. Описание. Инициализирует хэш-карту по умолчанию для таблицы. Добавлено в NDB 7.2.7. Сигнатура. или Параметры. Ссылка на хэш-карту и количество фрагментов.
Произвольно количество букетов. Возвращаемое значение.
0 при успехе, при ошибке -1 и установит ошибку. Описание. Этот метод используется, чтобы лишить законной силы
кэшированный индексный объект. Сигнатура. На индекс, лишенный законной силы этим методом, можно
сослаться как на объект Параметры. Названия индекса, который будет удален из кэша
и таблицы, которой это принадлежит
( Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы лишить законной силы
кэшированный объект таблицы. Сигнатура. Допустимо использовать объект
Параметры. Имя Возвращаемое значение.
Нет. Описание. Этот метод возвращает список всех событий,
определенных в рамках словаря. Сигнатура. Параметры. Ссылка на объект
Возвращаемое значение.
Описание. Этот метод используется, чтобы получить
Сигнатура. Параметры. Ссылка на Название таблицы Возвращаемое значение.
Описание. Этот метод используется, чтобы получить список объектов в
словаре. Возможно получить все объекты в словаре или ограничить список
объектами единственного типа. Сигнатуры. или Параметры. Ссылка на объект
Можно также определить, действительно ли имена объектов в
Возвращаемое значение.
Описание. Создает или получает хэш-карту, подходящую для изменения.
Требует, чтобы транзакция схемы произошла, посмотрите
раздел 2.3.4.2. Добавлено в NDB 7.2.7. Сигнатура. или Параметры. Ссылки на старые и новые таблицы.
Произвольно число букетов. Возвращаемое значение.
0 при успехе, при ошибке -1 и установит ошибку. Описание. Этот метод освобождает
Сигнатура. Параметры.
Возвращаемое значение.
Нет. Пример.
См. раздел 2.3.27. Описание. Этот метод удаляет указанную таблица из местного кэша. Сигнатура. Параметры. Название Возвращаемое значение.
Нет. Описание. Этот метод удаляет указанный индекс из местного кэша. Сигнатура. Параметры. Метод Имя индекса Имя таблицы Возвращаемое значение.
Нет. Резюме Эта секция обсуждает структуру Родительский класс.
Описание. Структура Атрибуты. Таблица 2.13. Резюме Эта секция обсуждает класс Родительский класс.
Дочерние классы.
Нет Описание. Этот класс представляет событие базы
данных в NDB Cluster. Методы. Таблица 2.14.
Улучшенное Event API (NDB 7.4.3 и выше).
NDB 7.4.3 вводит управляемый эпохой Event API, который заменяет более раннюю
основанную на GCI модель. Новая версия API также упрощает обнаружение ошибок
и обработку. Эти изменения осознаны в API NDB, осуществив много новых методов
для Некоторые новые методы непосредственно заменяют устаревшие, но не все
устаревшие отображены к новым, некоторые из которых совершенно новые.
Старые методы (устаревшие) показывают в первой колонке следующей таблицы и
новые методы во второй колонке, старые методы, соответствующие новым методам,
показывают в той же самой строке. Таблица 2.15. Обработка ошибок используя новый API достигается, проверяя значение,
возвращенное из
Результат этих изменений состоит в том, что в NDB 7.4.3 и позже можно
проверить ошибки, проверяя тип события таблицы, как показано здесь: Для получения дополнительной информации см. подробные описания для
методов Типы. Это публичныетипы класса Таблица 2.16. Описание. Этот метод используется, чтобы добавить колонку, на
которой должны быть обнаружены события. Столбец может быть обозначен
ID или именем. Необходимо вызвать
Если вы знаете несколько столбцов по имени, можно позволить обнаружение
событий на всех сразу при помощи
Сигнатура. Идентификация события, используя
его идентификатор столбца: Идентификация колонки по имени: Параметры. Этот метод берет отдельный аргумент, который может быть
любым одним из следующего: ID столбца ( Имя столбца Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы позволить обнаружение
событий на нескольких столбцах в то же время.
Необходимо использовать названия столбцов. Как и Сигнатура. Параметры. Этот метод требует двух аргументов, перечисленных здесь:
Количество столбцов Названия столбцов Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы добавить типы событий,
которые должны быть обнаружены. Сигнатура. Параметры. Этот метод требует значение
Возвращаемое значение.
Нет. Описание. Конструктор
Необходимо иметь в виду, что API NDB не отслеживает ассигнованные
объекты-события, что означает, что пользователь должен явно удалить
the Сигнатуры. Альтернативно, можно использовать имя событий и связанную таблицу: Параметры. Как минимум, имя
Возвращаемое значение. Новый экземпляр
Деструктор. Деструктор для этого класса поставляется как
виртуальный метод, который не берет аргументов и чей тип возвращения
Резюме Эта секция обсуждает Описание. Значения этого типа используются, чтобы описать жизнь или
постоянство события, а также его объем. Возможные значения. Таблица 2.17. Резюме Эта секция обсуждает тип Описание. Значения этого типа используются, чтобы определить
возможности сообщения для событий таблицы. Возможные значения. Таблица 2.18. Описание. Этот метод получает жизнь и объем события (то есть,
Сигнатура. Параметры. Нет. Возвращаемое значение.
Значение
Описание. Этот метод используется, чтобы получить определенную
колонку из числа тех, на которых определяется событие. Сигнатура. Параметры. Номер ( Возвращаемое значение. Указатель на
Описание. Этот метод получает название события. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название события, как указатель на символ.
Описание. Этот метод получает количество столбцов, на
которых определяется событие. Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество столбцов (integer) или
Описание. Этот метод получает статус объекта события. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Статус объекта события. Для возможных значений посмотрите
раздел 2.3.31.4. Описание. Этот метод получает версию объекта события (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта события как integer. Описание. Этот метод получает идентификатор объекта события. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта события как integer.
Описание. Этот метод используется, чтобы получить опции сообщения
для этого события. Сигнатура. Параметры.
Нет. Возвращаемое значение. Опции сообщения определяются в
разделе 2.3.6.6. Описание. Этот метод используется, чтобы найти таблицу,
с которой связано событие. Это возвращает ссылку на объект
Сигнатура. Параметры.
Нет. Возвращаемое значение. Таблица, с которой событие связано,
если есть, как указатель на объект
Описание. Этот метод используется, чтобы проверить, будет ли данное
событие таблицы обнаружено. Сигнатура. Параметры. Этот метод берет единственный параметр, тип события
таблицы, то есть значение
Возвращаемое значение. Этот метод вернет
Описание. Этот метод получает название таблицы, с которой событие
связано, может служить удобной альтернативой
Сигнатура. Параметры.
Нет. Возвращаемое значение. Название таблицы, связанной с этим событием,
как указатель на символ. Описание. Этот метод используется, чтобы установить
флаг слияния событий, который является
по умолчанию Для данного
Событие таблицы blob создается для каждого признака blob
и события blob обработаны как часть главных событий таблицы. Данные о Blob из событий части blob могут быть прочитаны через
методы В настоящее время этот флаг не унаследован
Сигнатура. Параметры. Значение
Возвращаемое значение.
Нет. Описание. Этот метод устанавливает длительность события то есть,
время жизни и объем. Сигнатура. Параметры. Этот метод требует значение
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы установить возможность
сообщения для события. Значения возможных опций могут быть найдены в
разделе 2.3.6.6. Сообщение о событиях DDL. Необходимо вызвать
Например, чтобы позволить событие DDL, сообщающее относительно объекта
Сигнатура. Параметры. Значение опции
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы определить имя события.
Имя должно быть уникальным среди всех событий, видимых от текущего
приложения (см. раздел
2.3.6.7). Можно также определить имя события, сначала создав его. Посмотрите
раздел 2.3.6.4. Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Этот метод определяет таблицу, на которой должны
быть обнаружены события. По умолчанию обнаружение событий происходит на всех столбецх в таблице.
Используйте Сигнатура. NDB 7.2.14, NDB 7.3.3 и позже поддерживают использование указателя с этим
методом, как показано здесь: Когда используется так, эта версия Параметры. Этот метод требует единственного параметра, ссылки на
таблицу (см. раздел 2.3.37)
на которой должны быть обнаружены события.
NDB 7.2.14, NDB 7.3.3 и позже: ссылка или указатель на
таблицу могут использоваться. Возвращаемое значение.
Нет.
NDB 7.2.14, NDB 7.3.3 и позже: -1,
если используется указатель null для таблицы. Резюме Эта секция описывает тип Описание.
Возможные значения. Таблица 2.19. Резюме Эта секция описывает структуру
Родительский класс.
Описание. Эта структура была добавлена в NDB 7.4.3
для работы со статистикой использования буферной памяти событий.
Это используется в качестве аргумента
Атрибуты. Таблица 2.20. Резюме Этот класс представляет внешний ключ на таблице
Родительский класс.
Дочерние классы.
Нет. Методы. Таблица 2.21. Типы. Класс Описание. Создайте совершенно новую ссылку внешнего ключа
или копию существующего. Сигнатура. Новый экземпляр: Конструктор копии: Параметры. Для нового экземпляра:
Нет. Для конструктора копии: ссылка на существующий экземпляр
Возвращаемое значение. Новый экземпляр
Возможные значения. Таблица 2.22. См. FOREIGN KEY Constraints в
MySQL Manual. Описание. Получает название экземпляра
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Имя Описание. Получает родительскую таблицу для экземпляра
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на родительскую таблицу
Описание. Получает дочернюю таблицу для экземпляра
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на дочернюю таблицу
Описание. Получает количество столбцов в родительской таблице этого
Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество столбцов в родительской таблице.
Описание. Получает количество столбцов в дочерней таблице этого
Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество столбцов в дочерней таблице. Описание. 0, если дочерняя таблица ссылается на первичный
ключ родительской таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. См. описание. Описание. 0, если дочерние ссылки решены, используя первичный
ключ дочерней таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. См. описание. Описание. Этот метод получает порядковый номер колонки внешнего
ключа в родительской таблице для данного индекса. См. документацию для
Сигнатура. Параметры.
Нет. Возвращаемое значение. Порядковый номер колонки. Описание. Этот метод получает порядковый номер колонки внешнего
ключа в дочерней таблице для данного индекса. См. документацию для
Сигнатура. Параметры.
Нет. Возвращаемое значение. Порядковый номер колонки. Описание. Получите действие Сигнатура. Параметры.
Нет. Возвращаемое значение. Порядковый номер колонки. Описание.
Описание. Получите действие Сигнатура. Параметры.
Нет. Возвращаемое значение. Порядковый номер колонки. Описание. Определите имя экземпляра
Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Установить родительскую таблицу
Сигнатура. Параметры. Ссылка на
Возвращаемое значение.
Нет. Описание. Установите дочернюю таблицу
Сигнатура. Параметры. Ссылка на
Возвращаемое значение.
Нет. Описание. Установите действие Сигнатура. Параметры. Действие Возвращаемое значение.
Нет Описание. Установите действие Сигнатура. Параметры. Действие Возвращаемое значение.
Нет Описание. Получите статус объекта (см.
раздел 2.3.31.4) для этого объекта
Сигнатура. Параметры.
Нет. Возвращаемое значение. Статус объекта
Описание. Получите идентификатор объекта (см.
раздел 2.3.31.7) для
данного объекта Сигнатура. Параметры.
Нет. Возвращаемое значение. ID объекта
Описание. Получите версию объекта (см.
раздел 2.3.31.9)
для этого объекта Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер версии объекта
Родительский класс.
Описание. Эта структура используется, чтобы определить
дополнительное значение, чтобы получить как часть
Члены. Элементы, составляющие эту структуру,
показаны в следующей таблице: Таблица 2.23. Память, на которую указывает
В настоящее время чтение blob не может быть определено, используя
См. раздел 2.3.27. Резюме Этот класс представляет хэш-карту в NDB Cluster. Добавлен в NDB 7.2.7. Родительский класс.
Дочерние классы.
Нет. Методы. Таблица 2.24. Типы. Класс Описание. Конструктор класса
См. раздел 2.3.4.6.
Сигнатура. Основной конструктор: Конструктор копии: Деструктор: Параметры.
Нет или адрес существующего
объекта Возвращаемое значение. Новый экземпляр Описание. Определяет имя хэш-карты. Сигнатура. Параметры. Имя, которое будет назначено hashmap. Возвращаемое значение.
Нет. Описание. Получает название хэш-карты. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название хэш-карты. Описание. Назначает ряд значений карте. Сигнатура. Параметры. Указатель на ряд
Возвращаемое значение.
Нет. Описание. Получает длину хэш-карты, то есть, количество значений,
которые это содержит. Можно получить значения с использованием
Сигнатура. Параметры.
Нет. Возвращаемое значение. Длина хэш-карты. Описание. Получает значения из карты. Сигнатура. Параметры. Указатель на ряд значений
( Возвращаемое значение.
0 при успехе, при неудаче -1 и установит ошибку. Описание. Сравнивает (только) значения этой
Сигнатура. Параметры. Ссылка на карту, с которой будет сравнена эта. Возвращаемое значение.
Нет. Описание. Этот метод получает статус
Сигнатура. Параметры.
Нет. Возвращаемое значение. Возвращает текущий
Описание. Метод получает версию объекта схемы хэш-карты. Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер версии объекта integer. Описание. Этот метод получает ID хэш-карты. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта integer. Резюме Эта секция обеспечивает ссылку на класс
Родительский класс.
Дочерние классы.
Нет. Описание. Этот класс представляет индекс на столбце таблицы
Методы. Таблица 2.25. Типы. У индекса есть один публичный тип
Если вы создаете или изменяете индексы, используя
Описание. Это используется, чтобы создать новый экземпляр
Созданные с использованием API NDB индексы не видны MySQL Server. Сигнатура. Параметры. Название нового индекса. Возможно создать индекс без
имени, и затем назначить имя ему позже с использованием
Возвращаемое значение. Новый экземпляр
Деструктор. Деструктор ( Описание. Этот метод может использоваться, чтобы
добавить колонку к индексу. Порядок столбцов соответствует порядку, в котором они добавляются к
индексу. Однако это имеет значение только с упорядоченными индексами. Сигнатура. Параметры. Ссылка Возвращаемое значение.
Нет. Описание. Этот метод работает таким же образом, как
Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы добавить несколько имен
столбцов к определению индекса. Как Сигнатура. Параметры. Этот метод берет два параметра, перечисленные здесь: Количество столбцов и имен
Имена Возвращаемое значение.
Нет. Описание. Этот метод получает колонку в
указанной позиции в индексе. Сигнатура. Параметры. Порядковый номер позиции
Возвращаемое значение. Столбец, имеющий позицию
Описание. Используйте этот метод, чтобы определить, была ли
регистрация на диск позволена для индекса. Индексы, которые не зарегистрированы, восстановлены, когда кластер
запущен или перезапущен. Упорядоченные индексы в настоящее время не поддерживают регистрацию на
диске, они восстановлены каждый раз, когда кластер запущен.
Это включает перезапуски. Сигнатура. Параметры.
Нет. Возвращаемое значение. Описание. Этот метод используется, чтобы получить название индекса.
Сигнатура. Параметры. Нет. Возвращаемое значение. Название индекса, как постоянный
указатель на символ. Описание. Этот метод используется, чтобы получить количество
столбцов, составляющих индекс. Сигнатура. Параметры.
Нет. Возвращаемое значение. unsigned integer, представляющий
количество столбцов в индексе. Описание. Этот метод получает статус объекта индекса. Сигнатура. Параметры.
Нет. Возвращаемое значение.
A Описание. Этот метод получает версию объекта индекса (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта индекса как integer. Описание. Этот метод используется, чтобы получить
идентификатор объекта индекса. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта как integer. Описание. Этот метод может использоваться, чтобы получить название
таблицы, которой принадлежит индекс. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название таблицы, как постоянный
указатель на символ. Описание. Этот метод может использоваться, чтобы найти тип индекса.
Сигнатура. Параметры.
Нет. Возвращаемое значение. Тип индекса. Посмотрите
раздел 2.3.11.18. Описание. Этот метод используется, чтобы включить или
отключить регистрацию индекса на диск. Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Этот метод определяет имя индекса. Это единственный метод
Сигнатура. Параметры. Желаемое имя Возвращаемое значение.
Нет. Описание. Этот метод устанавливает таблицу, которая должна быть
внесена в индекс. На таблицу ссылаются по имени. Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы установить тип индекса. Сигнатура. Параметры. Тип Возвращаемое значение.
Нет. Описание. Это перечислимый тип, который описывает вид индекса
столбца, представленного экземпляром
Не путайте этот перечислимый тип с
Возможные значения. Таблица 2.26. Родительский класс.
Описание. Члены. Таблица 2.27. См. раздел 2.3.27. Резюме Эта секция обсуждает класс Родительский класс.
Дочерние классы.
Нет. Описание. Этот класс представляет группу файла журнала NDB Cluster
Disk Data, которая используется для того, чтобы хранить дисковые данные
файла отмен. Для получения общей информации о группах файла журнала и
файла отмен см.
NDB Cluster Disk Data Tables в MySQL Manual. Только неиндексируемые данные столбца могут храниться на диске.
Индексы и колонки индексов всегда хранятся в памяти. Методы. Таблица 2.28. Типы. Класс Описание. Класс Класс
Сигнатуры. Новый экземпляр: Конструктор копии: Параметры. Создавая новый экземпляр, конструктор не берет
параметров. Копируя существующий экземпляр, конструктору нужна ссылка на
экземпляр
Возвращаемое значение. Объект
Деструктор. Описание. Этот метод получает
Сигнатура. Параметры.
Нет. Возвращаемое значение. Структура данных
Описание. Этот метод получает имя группы файла журнала. Сигнатура. Параметры.
Нет. Возвращаемое значение. Имя группы файла журнала, строка
(как указатель на символ). Описание. Этот метод используется, чтобы получить
идентификатор объекта группы файла журнала. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта
файла журнала (integer). Описание. Этот метод используется, чтобы получить статус объекта
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод получает версию объекта файла журнала (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта кластера файла
журнала как integer. Описание. Этот метод получает размер буфера
Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер буфера
Описание. Этот метод получает число байтов, неиспользованных в
буфере Сигнатура. Параметры.
Нет. Возвращаемое значение. Число свободных байтов
как 64-bit integer. Описание. Этот метод устанавливает
Сигнатура. Параметры. Данные передаются как единственный параметр в виде
структуры
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы определить имя для
группы файла журнала. Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Этот метод может использоваться, чтобы установить размер
буфера Сигнатура. Параметры. Размер Возвращаемое значение.
Нет. Резюме Эта секция покрывает класс Родительский класс.
Dictionary. Дочерние классы.
Нет. Описание. Класс Методы класса. У этого класса есть только два метода, конструктор и
деструктор. Никакой метод не берет аргументов. Конструктор. Запрос конструктора
Деструктор. Деструктор Атрибуты. Типы. Класс Резюме Эта секция описывает структуру Родительский класс.
Описание. Атрибуты. Таблица 2.29. Резюме Этот класс представляет ядро Родительский класс.
Нет. Дочерние классы.
Нет. Описание. Любая нетривиальная программа API NDB использует по
крайней мере один экземпляр Потребление ресурсов объектами Ndb.
Объект Объект Семафоры и мьютексы это примеры легких способов обеспечить барьеры памяти,
не имея необходимость беспокоиться о понятии барьера памяти. Также возможно использовать многократные объекты
Методы. Таблица 2.30. Описание. Это создает экземпляр
Сигнатура. Параметры. Конструктор класса
До NDB 7.3.8 и NDB 7.4.3 было возможно удалить
Это эквивалентно тому, что
mysqld рассматривает как
базу данных. Значение по умолчанию для этого параметра пустая строка. Дополнительно Значение по умолчанию для этого параметра последовательность
def. Возвращаемое значение.
Объект ~Ndb() (Деструктор класса). Деструктор для класса
Описание. Это - один из двух методов API NDB, предусмотренных
для закрытия транзакции (другой
Если транзакция еще не была передана, она прерывается, когда этот метод
вызывают. Посмотрите раздел
2.3.16.35. Сигнатура. Параметры. Этот метод берет отдельный аргумент, указатель на
транзакцию Описание. Этот метод может использоваться, чтобы вычислить значение
хэш-функции распределения, учитывая таблицу и ее ключи. Сигнатура. Параметры. Если вызов метода успешен,
Указатель на Если Ранее предполагалось что память, возвращенная
Возвращаемое значение. 0 при удаче, код ошибки при сбое.
Если вызов метода имеет успех, вычисленное значение хэш-функции сделано
доступным через Описание. Этот метод создает подписку на событие базы данных. Подписки событий NDB API не сохраняются после того, как кластер NDB
был восстановлен, используя
ndb_restore,
в таких случаях все подписки должны быть воссозданы явно. Сигнатура. Параметры. Этот метод берет отдельный аргумент, уникальное
имя Возвращаемое значение.
Указатель на объект
Описание. Этот метод удаляет подписку на событие базы данных,
представленное объектом
Память, используемая операцией события, которое было удалено,
не освобождена, пока буфер событий не был полностью прочитан. Это означает,
что необходимо продолжить вызывать
Сигнатура. Параметры. Этот метод требует единственного входного параметра,
указателя на экземпляр
Возвращаемое значение.
0 при успехе,
любой другой результат указывает на неудачу. Описание. Этот метод используется, чтобы получить объект для
восстановления или управления информацией о схеме базы данных. Этот объект
Словарь, возвращенный этим методом, работает независимо от любой
транзакции. См. раздел 2.3.4. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Экземпляр класса
Описание. Этот метод может использоваться, чтобы получить название
текущей базы данных. Сигнатура. Параметры. Нет. Возвращаемое значение. Название текущей базы данных. Описание. Этот метод может использоваться, чтобы получить текущее
название схемы базы данных. Сигнатура. Параметры. Нет. Возвращаемое значение. Название текущей схемы базы данных. Описание. Проходит по отличным операциям событий, которые являются
частью текущего GCI, становясь действительными после запроса
Этот метод устарел в NDB 7.4.3 и подвергается удалению в будущем выпуске.
В NDB 7.4.3 и позже необходимо использовать
Сигнатура. Параметры. Итератор и маска типов событий. Установите для начала
Возвращаемое значение. Следующая операция событий, вернет
Описание. Получает максимальную память в байтах, которая может
использоваться для буфера событий. Это совпадает с чтением значения
системной переменной MySQL Server
Добавлено в NDB 7.2.14 и NDB 7.3.3. Сигнатура. Параметры.
Нет. Возвращаемое значение. Максимальная память, доступная для
буфера событий, в байтах. Описание.
Получает Добавлено в NDB 7.4.3. Сигнатура. Параметры. Процент ( Возвращаемое значение.
Нет. Описание. Получает использование буфера событий как процент
Добавлено в NDB 7.4.3. Сигнатура. Параметры. Ссылка на структуру
Возвращаемое значение.
Нет. Описание. Добавлено в NDB 7.4.3, этот метод заменяет устаревший
До NDB 7.4.7 этот метод возвратил самый большой номер эпохи в очереди
событий. В NDB 7.4.7 и позже это возвращает самый большой номер эпохи
после запроса Сигнатура. Параметры.
Нет. Возвращаемое значение. Новый номер эпохи, integer. Описание. Получает индекс для новой глобальной контрольной точки.
Этот метод устарел в NDB 7.4.3. В NDB 7.4.3 и позже необходимо
использовать
Сигнатура. Параметры.
Нет. Возвращаемое значение. Новый GCI, integer. Описание. Этот метод предоставляет вам два различных способа
получить объект Сигнатура. Метод Первый из них просто получает новую ошибку: Второй вариант возвращает ошибку при соответствии данному коду ошибки: Независимо от того, которая версия метода используется, объект
Параметры. Чтобы получить новую ошибку, просто вызовите
Возвращаемое значение. Объект
Описание. Этот метод обеспечивает легкий и безопасный способ
получить доступ к любой дополнительной информации об ошибке, вместо того,
чтобы читать эти дополнительные детали от объекта
Сигнатура. Параметры. Чтобы получить подробную информацию об ошибке, вызовите
Возвращаемое значение. Когда дополнительные детали о
Описание. Если имя было определено для объекта
Сигнатура. Параметры.
Нет. Возвращаемое значение. Имя объекта Добавлено в NDB 7.2.17 и NDB 7.3.6 (Bug #18419907). Описание. Проходит по операциям по одиночным событиям, составляющим
текущую глобальную контрольную точку. Используйте следующий
Исключительные эпохи не начинают операций событий, связанных с ними. Сигнатура. Параметры. Первоначально задайте Возвращаемое значение. Указатель на следующий
Описание. Проходит по операциям по одиночным событиям, составляющим
текущую глобальную контрольную точку. Используйте следующий
Исключительные эпохи не начинают операций событий, связанных с ними. Сигнатура. Параметры. Первоначально задайте Возвращаемое значение. Указатель на следующий
Добавлено в NDB 7.2.32, 7.3.20, 7.4.18, 7.5.9 и 7.6.4 (Bug #26333981). Описание. Этот метод может использоваться, чтобы получить ссылку на
данный объект Сигнатура. Параметры.
Нет. Возвращаемое значение. 32-bit unsigned integer. Описание. Этот метод используется, чтобы инициализировать объект
Сигнатура. Параметры. Метод Каждая операция по просмотру или индексу использует дополнительный объект
Возвращаемое значение. Этот метод возвращает
0: указывает, что
объект -1: указывает на ошибку.
Описание. Проверяет, последовательны ли все события. Если сбой узла
происходит, когда ресурсы исчерпаны, события могут быть потеряны
и поставленные данные о событии могли бы таким образом быть неполными.
Этот метод позволяет определить это. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
Сигнатура. Параметры. Ссылка на глобальный индекс контрольной точки.
Это первый непоследовательный найденный GCI, если таковые имеются. Возвращаемое значение.
Описание. Если сбой узла происходит, когда ресурсы исчерпаны,
события могут быть потеряны и поставленные данные о событии могли бы таким
образом быть неполными. Этот метод позволяет определить это
проверяя, последовательны ли все события в данном GCI. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
Сигнатура. Параметры. Глобальный индекс контрольной точки. Возвращаемое значение.
Описание. Проверяет были ли эпохи с очередями выше замечены
последним вызовом
Это возможно, после того, как был сбой кластера
в течение самой высокой очереди эпохи, возвращенной
Добавлено в NDB 7.2.21, NDB 7.3.10 и NDB 7.4.7 (Bug #18753887). Сигнатура. Параметры.
Нет. Возвращаемое значение. True, если эпохи с очередями были замечены
последним
Описание. Возвращает следующую операцию событий, имеющую данные
из подписной очереди. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
Сигнатура. Параметры. Нет. Возвращаемое значение. Этот метод возвращает объект
Начиная с NDB 7.2.17 и NDB 7.3.6, этот метод очищает непоследовательные
события данных из очереди событий, обрабатывая их. Чтобы очистить все такие
события в этих и более поздних версиях, приложения должны вызвать этот метод
даже в случаях, когда
Описание. Возвращает операцию событий, связанную с данными, из
очереди событий. Это нужно вызывать неоднократно после того, как
Добавлено в NDB 7.4.3, этот метод заменяет устаревший
После запроса этого метода надо использовать
Сигнатура. Параметры. Нет. Возвращаемое значение. Этот метод возвращает объект
Описание. Этот метод ждет GCP, чтобы закончить. Это используется,
чтобы определить, доступны ли какие-либо события в подписной очереди. метод ждет в течение следующей эпохи
, а не следующего GCP. Посмотрите
раздел 2.3.21. В NDB 7.4.3 и позже, вы можете (и должны) использовать
До NDB 7.4.7 Сигнатура. Параметры. Этот метод берет эти два параметра: Максимальное время, чтобы ждать, в миллисекундах, перед
отказом и сообщением, что никакие события не были
доступны (то есть, прежде чем метод автоматически возвращает
Отрицательная величина заставляет ожидание быть неопределенным
. Это не рекомендуется (и не поддерживается методом-преемником
Индекс новой глобальной контрольной точки. Обычно этому можно
безопасно разрешить принять его значение по умолчанию, которое является
Возвращаемое значение.
В NDB 7.4.7 и позже отрицательная величина указывает на неудачу и
NDB_FAILURE_GCI
( В NDB 7.4.7 и позже, когда Пустые события ( После столкновения с событием, содержащим непоследовательные данные
( Важно:
Хотя непоследовательные данные о событии удалены из очереди событий, вызывая
Когда Описание. Ждет события. Срабатывает как только любые данные о
событии доступны. Этот метод также перемещает полные данные о событии
эпохи в очередь событий. Добавлено в NDB 7.4.3, этот метод заменяет устаревший
Сигнатура. Параметры. Этот метод берет эти два параметра, перечисленные здесь:
Максимальное время, чтобы ждать, в миллисекундах, перед отказом и
сообщая, что никакие события не были доступны (то есть, прежде чем метод
автоматически возвращает В NDB 7.4.7 и позже, определяя отрицательную величину для этого аргумента,
Индекс самой высокой эпохи с очередями. Обычно этому можно безопасно
разрешить принять значение по умолчанию, которое является
Возвращаемое значение.
Описание. Этот метод используется, чтобы определить имя
текущей базы данных. Сигнатура. Параметры. Описание. Этот метод определяет имя текущей схемы базы данных. Сигнатура. Параметры. Название схемы базы данных. Описание. Организация очереди пустых эпох отключена по умолчанию.
Этот метод может использоваться, чтобы позволить такую организацию очереди, в
этом случае любые новые пустые эпохи, входя в буфер событий после вызова
метода, стоят в очереди. Когда организация очереди пустых эпох позволена,
Сигнатура. Параметры. Этот метод берет единственный входной параметр.
Вызов метода с Возвращаемое значение.
Нет. Описание. Устанавливает максимальную память в байтах, которая может
использоваться для буфера событий. Это имеет тот же самый эффект как
установка значения системной переменной MySQL Server
Добавлено в NDB 7.2.14 и NDB 7.3.3. Сигнатура. Параметры. Желаемый максимум Возвращаемое значение.
Нет. Описание. Устанавливает переменную
Добавлено в NDB 7.4.3. Сигнатура. Параметры. Процент ( Возвращаемое значение. Значение, которое было установлено. Описание. Начиная с NDB 7.2.17 и NDB 7.3.6,
можно определить произвольное, человекочитаемое имя, чтобы определить объект
Можно определить имя только однажды для данного объекта
Сигнатура. Параметры. Имя Возвращаемое значение. 0 при успехе. Описание. Этот метод используется, чтобы начать новую транзакцию.
Есть три варианта, самый простой из них, используя таблицу и ключ разделения
или ID разделения, чтобы определить операционного координатора (TC).
Третий вариант позволяет вам определить TC посредством указателя
на данные ключа. Когда транзакция закончена, она должна быть закрыта, используя
См. разделы 2.3.16.2
и раздел 2.3.30.1. Сигнатура. Параметры. Этот метод берет следующие три параметра: Осведомленные о распределении формы startTransaction().
Также возможно использовать
осведомленность распределения
с этим методом, то есть, чтобы предложить, какой узел должен действовать
как операционный координатор. Сигнатура. Параметры. Определяя операционного координатора, этот метод берет
эти четыре параметра: Указатель на Законченное пустым указателем множество указателей на значения
столбцов ключа распределения. Длина ключевой части
прочитана из метаданных и сравнена с переданным значением.
Указатель на временный буфер, используемый, чтобы вычислить
значение хэш-функции. Длина буфера. Если Пример. Предположим, что ключ разделения таблицы столбец
Значение ключа распределения было бы определено как показано здесь: Указатель на множество ключа распределения был бы
установлен следующим образом: Длина этого указателя была бы установлена соответственно: Множество ключа распределения должно закончиться
Установка буфера к Можно также определить буфер, чтобы сохранить необходимость сделать явно
Теперь, когда вы начинаете транзакцию, можно получить доступ к узлу,
который содержит желаемую информацию непосредственно. Другая осведомленная о распределении версия этого метода позволяет вам
определить таблицу и разделение (используя ID разделения) как намек для
отбора операционного координатора, определяется как показано здесь: Если у кластера есть то же самое количество узлов данных, как реплик,
определение операционного координатора не получает улучшения работы,
так как каждый узел данных содержит всю базу данных. Однако, где количество
узлов данных больше, чем количество реплик (например, где
Все еще возможно использовать этот метод как прежде, не определяя
операционного координатора. В любом случае необходимо все еще явно закрыть
транзакцию, независимо от успешности вызова
Возвращаемое значение. При успехе вернет объект
Резюме Этот класс представляет связь с кластером узлов данных. Родительский класс.
Нет. Дочерние классы.
Нет. Описание. Прикладная программа NDB должна начаться с создания
объекта Экземпляр
Разделение уровня приложения.
Нет никакого ограничения против создания многократных объектов
Например, возможно выполнить
разделение уровня приложения
данных таким способом, которым данные, встречающие один набор критериев
переданы одному кластеру, используя объект
Возможно расширить этот сценарий, чтобы разработать отдельное приложение,
которое получает доступ к произвольному числу кластеров.
Однако, при этом следующие условия и требования должны иметься в виду: Сервер управления кластера
(ndb_mgmd)
может соединиться с одним и только одним кластером, не будучи перезапущенным
и повторно настроенным, поскольку это должно прочитать данные, какие узлы
данных составляют кластер, из конфигурационного файла
( Объект См.
раздел 2.3.17.1. Объект См. раздел 2.3.16.1. Связи, описанные выше, сохраняются для сроков существования объектов
Поэтому обязательно в проектировании и реализовывании любого приложения,
что доступ к многократным кластерам в единственной сессии обеспечивается
отдельными экземплярами объектов
Также важно иметь в виду, что никакое прямое
разделение данных или узлов данных между
различными кластерами невозможно. Узел данных может принадлежать одному и
только одному кластеру и любое движение данных между кластерами
должно быть достигнуто на уровне приложения. Для примеров, демонстрирующих, как связи с двумя различными кластерами
могут устанавливаться и использоваться в отдельном приложении, посмотрите
разделы 2.5.2 и
3.6.2. Методы. Таблица 2.31. Получает настройки автоповтора соединения для узлов API, используя
Действительно ли новая попытка соединиться успешна Если новая попытка соединиться провалилась, обеспечивает причину
Тайм-аут перед адаптивной отправкой всех сигналов Количество потоков получения Используемый, чтобы повторить кратное число объектов
Получить уровень активации для связанного потока получения
Получите имя системы кластера Отключает создание новых объектов
Позволяет или отключает повторное автосоединение с узлами API,
используя Тайм-аут перед адаптивной передачей всех сигналов Определите номер потока получения, которые будет связан Установите один или несколько CPU для потока получения Позволяет создание новых объектов
Сброс привязки потока получения к CPU Описание. Этот метод создает связь с кластером NDB то есть, с
кластером узлов данных. Объект, возвращенный этим методом, требуется, чтобы
создать экземпляр объекта
Сигнатура. Параметры. Эта версия конструктора требует параметр
Второй конструктор берет ID узла в дополнение к
аргументу строки подключения. Сигнатура. Параметры. Эта версия конструктора берет два аргумента:
Возвращаемое значение.
Обе версии: Экземпляр
Описание. Этот метод соединяется с сервером управления кластера. Сигнатура. Параметры. Этот метод берет три параметра, все из
которых дополнительные: Возвращаемое значение. Этот метод возвращает
0:
Попытка подключения была успешна. 1:
Указывает на исправимую ошибку. -1:
Указывает на невосстанавливаемую ошибку. Описание. Этот метод получает текущее значение
Сигнатура. Параметры.
Нет. Возвращаемое значение. integer Описание. Этот метод может использоваться, чтобы определить
действительно ли новая попытка
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Если новая попытка подключения этим
Сигнатура. Параметры.
Нет. Возвращаемое значение. Последовательность, содержащая сообщение об
ошибке, описывающее неудачу
Описание. Получите минимальное время в миллисекундах до того,
как механизм адаптивной передачи пошлет все сигналы. Сигнатура. Параметры.
Нет. Возвращаемое значение. Время ожидания в миллисекундах.
Это должно всегда быть значением между 0 и 10 включительно. Описание. Этот метод используется, чтобы итерировать набор
объектов Сигнатура. Параметры. Этот метод берет единственный параметр, указатель на
последний объект Возвращаемое значение. Возвращает следующий объект
Returns the next
Итерирование объектов Ndb. Чтобы получить все существующие
объекты Вызовите метод
Получите первый доступный
После того, как вы получили все желаемые объекты
Описание. Получите количество потоков приемника. Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество потоков приемника. Описание. Получить уровень для активации потока приемника,
связанного
Сигнатура. Параметры.
Нет. Возвращаемое значение. Пороговое значение как integer. См.
раздел 2.3.17.18. Описание. Получает имя системы от кластерной конфигурации. Это
значение параметра конфигурации системы
Сигнатура. Параметры.
Нет. Возвращаемое значение. Имя кластерной системы. Если не задано
в файле кластерной конфигурации, это произведенное значение в форме
Описание. Запрос этого метода предотвращает создание новых
экземпляров класса Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Этот метод был сделан См.
раздел 2.3.17.7. Описание. Узел API, который отсоединен от кластера, вынужден
использовать новый объект связи, чтобы снова соединиться, если это поведение
не отвергнуто, установив Когда вызван, этот метод отвергает любое значение для
См. Defining SQL and Other API Nodes in an NDB Cluster. Сигнатура. Параметры. Значение Возвращаемое значение.
Нет. Описание. Устанавливает окружение узла данных, используемое для
оптимального размещения операционного координатора. Этот метод используется
после создания Можно использовать системную переменную сервера
Добавлено в NDB 7.5.2. Сигнатура. Параметры. ID узла, который будет использоваться в качестве соседа.
Возвращаемое значение.
Нет. Описание. Установите минимальное время в миллисекундах, которое
адаптивный механизм передачи ждет прежде чем послать все сигналы. Сигнатура. Параметры. Время ожидания в миллисекундах.
Диапазон 0-10, по умолчанию 10. Возвращаемое значение.
Нет. Описание. Определяет имя для связи. Если имя определяется, о нем
сообщают в регистрации кластера. Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Описание. Определите число потоков приемника, связанных с
CPU, определенное использованием
Этот метод должен быть вызван прежде, чем попытаться соединиться с
любыми другими узлами. Сигнатура. Параметры. Количество потоков. Единственное поддержанное
значение Возвращаемое значение.
Описание. Этот метод может использоваться, чтобы отвергнуть
поведение метода Сигнатура. Параметры. integer Возвращаемое значение.
Нет. Описание. Установите уровень для активации потока
приемника, связанного с помощью
Сигнатура. Параметры. integer Возвращаемое значение.
Описание. Начиная с NDB 7.5.7 и NDB 7.8.2,
этот метод может использоваться, чтобы создать URI для публикации в столбце
При условии, что этот метод вызывают до
Сигнатура. Параметры. Этот метод берет параметры, перечисленные здесь: Путь не может начаться с двойного слэша
( Возвращаемое значение.
0 при успехе, 1 в случае синтаксической ошибки. Описание. Установите CPU, с которым должен быть связан поток
приемника. Установите уровень для активации потока приемника, вызвав
Сигнатура. Параметры. Множество из одного или более CPU ID, с которыми должен быть
связан поток получения Длина этого множества ID потока получения для привязки, по умолчанию
Возвращаемое значение.
Описание. Используемый, чтобы установить тайм-аут для связи,
ограничить количество времени, которое мы можем заблокировать, соединяясь. Этот метод на самом деле обертка для функции
Сигнатура. Параметры. Длина тайм-аута в миллисекундах
( Возвращаемое значение.
0 при успехе, любое другое значение указывает на ошибку. Описание. Этот метод отменяет эффекты
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Этот метод был сделан См.
раздел 2.3.17.7. Описание.
Сбросить CPU, к которым привязан поток получения, используя
Сигнатура. Параметры. ID потока получения. Возвращаемое значение.
Описание. Этот метод необходим, чтобы установить связи с узлами
данных. Это ждет, пока требуемая связь с одним или более узлами данных не
будет успешна, или пока не кончится тайм-аут. Сигнатура. Параметры. Возвращаемое значение.
Резюме Этот класс представляет обработчик столбца
Родительский класс.
Нет. Дочерние классы.
Нет. Описание. У этого класса нет публичного конструктора. Экземпляр
Хранение данных BLOB.
Данные Заголовок и действующие байты сохранены в признаке blob. Сегменты данных blob сохранены в отдельной таблице
Размеры сегмента данных могут быть установлены, используя соответствующмй
метод Типы доступа к данным.
В фазе подготовки методы Также в фазе подготовки
В активной фазе
Работа с BLOB. Операции Используйте
BLOB и NdbOperation. Методы
Когда блокировка
Просмотр с любым способом блокировки может использовать свои
обработчики, чтобы прочитать значения, но не написать их. Просмотр, используя способ блокировки Просмотр, используя способ блокировки
Операция, которая возвращена
Известные проблемы. Следующее это известные проблемы или
ограничения, с которыми сталкиваются, работая с объектами
Слишком многие ожидающие операции
Таблица и ее таблицы сегментов данных
Методы. Таблица 2.32. Методы
Большинство методов Типы. Таблица 2.33. Резюме ActiveHook это тип данных, определенный для использования в качестве
отзыва для метода Определение.
Описание. Это отзыв для
Описание. Этот метод инициализирует список blob, принадлежащих
текущей операции, и возвращает первый blob в списке. Сигнатура. Параметры. Нет. Возвращаемое значение. Указатель на желаемый blob. Описание. Используйте метод, чтобы получить следующий в списке
blob. См. раздел 2.3.18.2
. Сигнатура. Параметры. Нет. Возвращаемое значение. Указатель на желаемый blob. Описание. Закрывает обработчик, высвобождая внутренние средства
до совершения или прерывания транзакции. Другими словами, это сигнализирует,
что приложение закончило с чтением от данного blob.
Этот метод можно вызвать только когда blob
Операции чтения и блокировки. Когда обработчик blob
создается на операции чтения при использовании
Когда строка, содержащая blob, была прочитана со способом блокировки
Сигнатура. Параметры. У этого метода есть единственный булев параметр
Возвращаемое значение.
0 при успехе. Описание. Этот метод получает имя события blob.
Событие создается, если главное событие контролирует колонку blob.
Имя включает главное имя события. Сигнатура. Параметры. Название события Возвращаемое значение.
Описание. Этот метод получает название таблицы
сегментов данных blob. Этот метод обычно имеет использование только для тестирования и отладки.
Сигнатура. Параметры. Возвращаемое значение.
Описание. Используйте этот метод, чтобы получить столбец
Сигнатура. Параметры. Нет. Возвращаемое значение.
Объект Column. См. раздел 2.3.2. Описание. Этот метод получает текущую длину blob в байтах. Сигнатура. Параметры. Ссылка на длину. Возвращаемое значение. Длина blob в байтах. Для
Описание. Этот метод проверяет, является ли значение
Сигнатура. Параметры. Ссылка на integer
Возвращаемое значение.
Нет. Описание. Используйте этот метод, чтобы получить ошибочный объект.
Ошибка может быть определенной для blob или может быть скопирована с
неудавшейся неявной операции. Код ошибки копируется назад к операции, если у
операции уже нет кода ошибки отличного от нуля. Сигнатура. Параметры. Нет. Возвращаемое значение.
Объект Описание. Этот метод может использоваться, чтобы найти операцию с
который связан обработчик для этого
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на операцию. Операция, на которую ссылается указатель, возвращенный этим методом, может
быть представлена любым объектом
Описание. Этот метод получает текущее положение
чтения-записи в blob. Сигнатура. Параметры. Один параметр, ссылка на положение. Возвращаемое значение. Описание. Этот метод получает текущее состояние объекта
Сигнатура. Параметры. Нет. Возвращаемое значение.
Значение Описание. Используйте этот метод, чтобы подготовиться читать
значение blob, значение доступно следующим вызовом. Используйте
Сигнатура. Параметры. Этот метод берет два параметра. Первым из них является
указатель на Возвращаемое значение.
Описание. Этот метод используется, чтобы различать, основана ли на
запросе или на событии операция по blob. Сигнатура. Параметры. Этот метод берет единственный параметр, ссылку на
integer на версию blob (операционный тип). Возвращаемое значение. Описание. Этот метод используется, чтобы прочитать данные из blob.
Сигнатура. Параметры. Возвращаемое значение.
Описание. Этот метод определяет отзыв для активации обработчика
blob. Очередь подготовленных операций будет выполнена в непередаваемом
режиме до этого пункта, затем отзыв вызван.
Для получения дополнительной информации посмотрите
раздел 2.3.18.1. Сигнатура. Параметры. Указатель на значение Указатель на Возвращаемое значение.
Описание. Этот метод устанавливает значение blob =
Сигнатура. Параметры. Нет. Возвращаемое значение.
Описание. Этот метод устанавливает положение,
в котором можно прочитать или написать данные. Сигнатура. Параметры. Метод setPos() берет единственный параметр
Sparse blob не поддерживаются в API NDB,
другими словами, не может быть никаких неиспользованных положений данных. Возвращаемое значение.
Описание. Этот метод используется, чтобы подготовиться к вставке
или обновлению blob. Любые существующие данные, которые более длинны, чем
новые данные, усечены. Буфер данных должен остаться действительным, пока
операция не была выполнена. Сигнатура. Параметры. Возвращаемое значение.
Резюме Это перечисляемый тип данных, который представляет возможные статусы
Описание. Возможные значения. Таблица 2.34. Описание. Этот метод используется, чтобы усечь blob к данной длине.
Сигнатура. Параметры.
Возвращаемое значение.
Описание. Этот метод используется, чтобы написать данные
Запись после текущего конца данных расширяет blob автоматически. Сигнатура. Параметры. Этот метод берет два параметра, указатель на данные
Возвращаемое значение.
Резюме Этот класс обеспечивает метаинформацию об объектах базы данных, таких как
таблицы, колонки и индексы. В то время как предпочтительный метод создания объекта базы данных и
удаления через MySQL Server, Родительский класс.
Нет. Дочерние классы.
Описание. Это класс словаря данных, который поддерживает запросы о
таблицах, столбцах и индексах. Это также обеспечивает способы определить эти
объекты базы данных и удалить их. Оба вида функциональности поставляются,
используя внутренние классы. Они включают следующие внутренние классы: Дополнительные подклассы
Таблицы и индексы, созданные с использованием
Удаление индексов через API NDB, которые были созданы первоначально из
кластера NDB, вызывает несоответствия. Возможно, что таблица, из которой
один или больше индексов были исключены, используя API NDB, больше не будет
применима MySQL после таких операций.
В этом случае таблица должен быть удалена, а затем воссоздана с
использованием MySQL, чтобы сделать ее доступной для MySQL еще раз. Методы. Таблица 2.35. Для числовых эквивалентов перечисленным подклассам
Описание. Возвращает битовую маску присутствия пустого столбца,
которая может использоваться с любым
Сигнатура. Параметры.
Нет. Возвращаемое значение. Пустая битовая маска. Описание. Получите первый признак ID, определенный объектом
Сигнатура. Параметры. Указатель на
Возвращаемое значение.
Boolean Описание. Получите следующий признак ID, определенный объектом
Сигнатура. Параметры. Указатель на
Возвращаемое значение. Boolean Описание. Получить смещение бита null данного атрибута ID от
начала строки
Сигнатура. Параметры. Возвращаемое значение. Boolean Описание. Получить смещение данного атрибута ID от начала строки
Сигнатура. Параметры. Смещение Возвращаемое значение.
Boolean Описание. Получите название объекта
Если объект Сигнатура. Параметры. Указатель на
Возвращаемое значение. Имя, если есть. Иначе или если объект
Описание. Получить число байтов, чтобы сохранить одну строку
данных, как описано структурой
Сигнатура. Параметры. Объект
Возвращаемое значение. Число байтов на строку. Описание. Возвратит название объекта таблицы, на который ссылается
Сигнатура. Параметры. Возвращаемое значение. Название таблицы или пустой указатель, если
тип объекта Описание. Возвратит тип объекта
Сигнатура. Параметры. Объект
Возвращаемое значение. Описание. Возвращает указатель на начало данных, определенных
признаком ID, ища смещение колонки, сохраненной в объекте NdbRecord
и возвращая сумму положения строки и смещения. Этот метод обеспечивает версии row-const и не-row-const. Сигнатура. Параметры. Указатель на объект
Возвращаемое значение. Указатель на начало признака в строке. Это
null, если признак не часть определения NdbRecord. Описание. Установлен ли бит null для данной колонки в
Сигнатура. Параметры. Указатель на объект
Возвращаемое значение.
Boolean Описание. Установите бит null для данной колонки к поставляемому
значению. Смещение бита получено из переданного объекта
Сигнатура. Параметры. Указатель на Возвращаемое значение.
0 при успехе, -1 если Резюме Эта секция обсуждает структуру Описание.
Error status:
Это описывает воздействие ошибки на приложении и отражает то, что должно
сделать приложение, когда с ошибкой сталкивается. Ошибочный статус описан значением типа
Error classification:
Это представляет логический ошибочный тип или группировку. Классификация ошибок описана значением типа
Error code: Это внутренний код ошибки
API NDB, который однозначно определяет ошибку. Не рекомендуется писать
прикладные программы, которые зависят от определенных кодов ошибок.
Вместо этого они должны проверить ошибочный статус и классификацию.
Больше информации об ошибках может также быть получено, проверив сообщения об
ошибках и (когда доступно) сообщения деталей ошибки. Однако, как коды ошибок,
эти сообщения об ошибках и сообщения деталей ошибки подвержены изменениям. Список текущих кодов ошибок, представлен в
разделе 2.4.2.
Этот листинг обновляется с новыми выпусками кластера NDB. Можно также
проверить файл MySQL Error code:
Это соответствующий код ошибки MySQL Server. Коды ошибок MySQL не обсуждены в
этом документе, пожалуйста, см.
Server Error Message Reference в MySQL Manual.
Error message:
Это универсальное, независимое от контекста описание ошибки.
Error details:
Это может часто предоставлять дополнительную информацию (не найденную в
сообщении об ошибке) об ошибке, определенную для обстоятельств, при которых
сталкиваются с ошибкой. Однако это доступно не во всех случаях. Где не определено, сообщение деталей ошибки
Это свойство устарело. Для получения деталей ошибки необходимо
использовать метод
Определенные коды ошибок API NDB, сообщения и
детали подлежат изменению без уведомления. Определение. Структура NdbError содержит следующих участников, типы
которых показаны здесь: Типы.
Описание. Этот тип описывает тип ошибки или логическую группу,
которой это принадлежит. Возможные значения. Таблица 2.36. Соответствующая информация, определенная для определенного состояния
ошибки, может быть найдена в разделах
2.4.2 и
2.4.4. Описание. Этот тип используется, чтобы описать статус ошибки. Возможные значения. Таблица 2.37. Соответствующая информация, определенная для определенного состояния
ошибки, может быть найдена в
разделе 2.4.4. Резюме Эта секция описывает класс Родительский класс.
Нет. Дочерние классы.
Нет. Описание. Создание экземпляра NdbEventOperation.
У этого класса нет публичного конструктора или деструтора. Вместо этого
экземпляры Должно существовать событие, которое было создано,
используя
Объект Экземпляр этого класса удален, вызвав
Подробное создание демонстрации в качестве примера и удаление операций
событий обеспечиваются в
разделе 2.5.8. Известные проблемы. Со следующими проблемами можно столкнуться,
работая с операциями событий в API NDB: Максимальное количество активных объектов
В настоящее время все события
Отметьте что ложные выходы из
Код события не
проверяет версию схемы таблицы. Когда таблица удалена,
удостоверьтесь, что вы пропускаете любые связанные события. Если вы получили полную эпоху, события с этой эпохи не перепосланы
даже в случае неудачи узла. Однако, если неудача узла произошла, последующие
эпохи могут содержать двойные события, которые могут быть определены по
дубликатам первичного ключа. В коде NDB Cluster replication дубликаты первичного ключа при
Чтобы рассмотреть содержание системной таблицы, содержащей созданные
события, можно использовать утилиту
ndb_select_all
: Методы. Таблица 2.38. Типы. Описание. Очищает ошибку, последний раз связанную с
этой операцией событий. Устарело в NDB 7.4.3. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Описание. Активирует
Один из Прежде, чем попытаться использовать этот метод, необходимо было прочитать
объяснения, обеспеченные в разделах
2.3.16.25, 2.3.21.13
и 2.3.21. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется вместо
Чтобы получить предыдущее значение для признака blob, надо использовать
Сигнатура. Параметры. Имя Возвращаемое значение. Указатель на объект
Описание. Получает эпоху для полученных данных последнего события.
Добавлено в NDB 7.4.3, этот метод заменяет
Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер эпохи (integer). Описание. Этот метод используется, чтобы получить тип события
(
Устарело в NDB 7.4.3. В NDB 7.4.3 и позже необходимо использовать
вместо этого
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы получить тип события
(
Добавлено в NDB 7.4.3, этот метод заменяет устаревший
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод восстанавливает GCI для последнего события.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
Сигнатура. Параметры.
Нет. Возвращаемое значение. Глобальный индекс контрольной точки
последнего полученного события (integer). Описание. Этот метод получает новый GCI. Этот метод возвращает последнее число эпохи. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
Полученное с использованием этого метода GCI не
обязательно связано с событием. Сигнатура. Параметры.
Нет. Возвращаемое значение. Индекс последней глобальной
контрольной точки, integer. Описание. Этот метод получает новую ошибку. Сигнатура. Параметры.
Нет. Возвращаемое значение. Ссылка на структуру
Описание. Эта функция совпадает с
Сигнатура. Параметры. Имя Возвращаемое значение.
Указатель на Описание. Этот метод выступает тождественно к getValue()
за исключением того, что это используется, чтобы определить поисковую
операцию предыдущего значения признака, а не текущего. Посмотрите
раздел 2.3.21.13. Сигнатура. Параметры. Этот метод берет эти два
параметра, перечисленные здесь: Имя Указатель на Если значение атрибута не Если значение атрибута Возвращаемое значение.
Объект Описание. Этот метод получает текущее состояние операции событий.
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Этот метод определяет поиск значения атрибута.
API NDB ассигнует память для объекта
Этот метод не получает
значение атрибута от базы данных и объект
Если определенный признак не изменился, соответствующий
Сигнатура. Параметры. Этот метод берет эти два параметра, перечисленные здесь:
Имя Указатель на Если значение атрибута не Если значение атрибута Возвращаемое значение.
Объект Описание.
Этот метод используется, чтобы определить, есть ли ошибка, связанная с
этой операцией событий. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже, необходимо вместо этого
использовать
Сигнатура. Параметры.
Нет. Возвращаемое значение. Если потеря событий произошла, то этот
метод возвращает 0, иначе 1. Описание. Этот метод используется, чтобы определить, произошла ли
потеря событий после сбоя узла. Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
Сигнатура. Параметры.
Нет. Возвращаемое значение. Если потеря событий произошла, то этот метод
возвращает Описание.
Этот метод используется, чтобы определить, отмечают ли потребляемые данные о
событии пустую эпоху. Добавлено в NDB 7.4.3. Сигнатура. Параметры.
Нет. Возвращаемое значение. Если эта эпоха пуста, вернет
Описание. Этот метод используется, чтобы определить, отмечают ли
потребляемые данные о событии пустую эпоху. Добавлено в NDB 7.4.3. Сигнатура. Параметры. Если это ошибочная эпоха, Возвращаемое значение. Если эта эпоха ошибочна, вернет
Описание. Этот метод используется, чтобы определить, произошла ли
потеря событий из-за переполнения буфера. Сигнатура. Параметры.
Нет. Возвращаемое значение. Если буфер событий был переполнен,
то этот метод возвращает Описание. Этот метод используется, чтобы установить флаг слияния
событий. Для получения информации о слиянии событий посмотрите
раздел 2.3.6.18. Флаг слияния событий по умолчанию Сигнатура. Параметры.
A Boolean Возвращаемое значение.
Нет. Описание. Этот тип описывает состояние операции событий. Возможные значения. Таблица 2.39. Значение Описание. Этот метод используется, чтобы проверить, изменилась ли
фрагментация таблицы в связи с событием Сигнатура. Параметры.
Нет. Возвращаемое значение. Вернет Описание.
Используйте этот метод, чтобы определить, изменился ли у таблицы файл
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод проверяет, изменилось ли имя таблицы как
результат события Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Используйте этот метод, чтобы проверить, изменилось ли
название списка разделения диапазона таблицы в связи с событием
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Резюме Эта секция описывает класс
Родительский класс.
Дочерние классы.
Нет. Описание. У этого класса нет публичного конструктора. Создать экземпляр
Методы. Таблица 2.40. Операциям по индексу не разрешают вставить кортежи. Типы. Класс См. раздел 1.3.2.3.2
. Описание. Этот метод определяет
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Получает индекс, учитывая операцию по индексу. Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на объект
Описание. Этот метод определяет
Сигнатура. Параметры.
Возвращаемое значение.
Описание. Этот метод определяет
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Резюме Эта секция обсуждает класс
Родительский класс.
Дочерние классы.
Нет. Описание. Класс Методы. Таблица 2.41. Типы. Класс Этот класс также определяет структуру
См. разделы 1.3.2.3.3 и
1.3.2.3.4. Описание. Этот тип используется, чтобы описать связанный ключ. Числовые значения фиксируются в API и могут использоваться явно,
другими словами, допустимо
вычислить значения и использовать их. Возможные значения. Таблица 2.42. Описание. Этот метод используется, чтобы отметить конец привязки,
это используется, когда читается пакет индекса
(то есть, используя многократные диапазоны). Сигнатура. Параметры. Номер диапазона, на котором происходит привязка. Возвращаемое значение.
Описание. Этот метод используется, чтобы проверить,
спускается ли просмотр. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод возвращает номер диапазона для текущей строки.
Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер диапазона (integer). Описание. Этот метод используется, чтобы проверить,
сортирован ли просмотр. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы прочитать кортежи,
используя упорядоченный индекс. Сигнатура. Параметры. Метод Режим блокировки Один или более флагов просмотра, многократные
Количество фрагментов, чтобы просмотреть в
Этот параметр был проигнорирован до MySQL 5.1.12, всегда
использовался максимум (Bug #20252). Возвращаемое значение.
integer: Описание. Перезагружает границы и помещает операцию в список,
который пошлют при следующем вызове
Сигнатура. Параметры. Установите Возвращаемое значение.
Описание. Этот метод определяет привязанный ключ индекса,
используемый в просмотре диапазона, и устанавливает границы для просмотров
индекса, определенных, используя
"Старое" использование API (до введения NdbRecord).
У каждого ключа индекса могут быть нижняя граница, верхняя граница или обе.
Установка ключа, равного значению, определяет верхние и нижние границы.
Границы могут быть определены в любом порядке.
Противоречивые определения дают ошибку. Границы должны быть установлены на начальных последовательностях ключей
индекса и все кроме возможно связанного последнего должны быть нестрогими.
Это означает, например, что a >= 2 AND b > 3
является допустимым, но a >2 AND b >=3 нет.
Просмотр может в настоящее время возвращать кортежи, для которых не
удовлетворены границы. Например, Устанавливая границы на основе равенства, лучше использовать
Индекс также хранит все ключи Сигнатура (старый API).
Используя старый API, этот метод можно было
вызвать любым из двух способов. Оба из них используют связанный тип и
значение, первый также использует название границ, как показано здесь: Второй способ вызвать этот метод в старом API
использует ID границ, а не имя, как показано здесь: Параметры (старый API). Имя Тип границы Указатель на границу Работа с NdbRecord. Этот метод вызывают, чтобы добавить диапазон к
операции по просмотру индекса, которая была определена
Где многократные пронумерованные диапазоны определяются с множественными
вызовами Сигнатура. Параметры. Если используется с
Дополнительная версия этого метода может использоваться, когда приложение
знает, что строки в диапазоне будут найдены только в рамках конкретного
разделения. Это совпадает с показанным ранее, за исключением добавления
Сигнатура (определяя разделение). Параметры (определяя разделение). Возвращаемое значение.
Returns Резюме Эта секция обсуждает класс Родительский класс.
Нет. Дочерние классы.
Нет. Описание. Этот интерфейс все еще разрабатывается и
подлежит изменению без уведомления.
Применение NdbInterpretedCode.
Чтобы создать объект Каждая операция API NDB относится к одной таблице, любая
программа Если никакой буфер не поставляется, то внутренний буфер динамично
ассигнован и расширен по мере необходимости. Создав объект
Программа может использоваться больше чем одной операцией.
Это не должно быть повторно подготовлено к последовательным операциям. Чтобы использовать программу с
Проверка на ошибки. По причинам эффективности методы этого класса
обеспечивают минимальную проверку на ошибки. Методы. Таблица 2.43. См. раздел 2.3.24.1.
Типы. Этот класс не определяет публичных типов. Следующие несколько секций предоставляют информацию о выполнении различных
типов операций с методами
Методы, описанные в этой секции, используются, чтобы загрузить постоянные
величины в регистры
Таблица 2.44. Пространство, требуемое каждым из этих методов,
показывают в следующей таблице: Таблица 2.45. См. разделы
2.3.24.43 и
2.3.24.47. Пространство, требуемое каждым из этих методов,
показывают в следующей таблице: Таблица 2.46. См. разделы
2.3.24.3 и
2.3.24.45. Класс
Сравнение между двумя значениями регистра Сравнение между значением столбца и данной константой Соответствует ли значение столбца данному образцу Чтобы определить этикетку, используйте метод
Чтобы выполнить безусловный переход к этикетке, используйте метод
Чтобы выполнить переход на данную этикетку на основе сравнения значений
регистра, используйте один из методов
Чтобы выполнить переход на данную этикетку на основе
сравнения значений столбца таблицы, используйте один из методов
Чтобы выполнить переход на данную этикетку на основе сопоставления с
образцом значения столбца таблицы, используйте один из методов
Большинство из них используется, чтобы ветвиться на основе результатов
сравнений регистров. Есть также два метода, используемые, чтобы сравнить
значение регистра с Эти методы могут считаться выполнением следующей логики: Пространство, требуемое каждым из этих методов,
показывают в следующей таблице: Таблица 2.47. Методы, описанные в этой секции, используются, чтобы выполнить переход на
основе сравнения между значением столбца таблицы и данной постоянной
величиной. Каждый из этих методов ожидает признак ID колонки, значение
которой должно быть проверено, а не ссылку на объект
Эти методы, за исключением
В каждом случае (еще раз за исключением
Требования места для каждого из этих методов показывают в следующей
таблице, где Таблица 2.48. Выражение Класс Синтаксис образца, поддержанный регулярным выражением, совпадает с MySQL
Server Это тот же самый синтаксис образца регулярного выражения, который
поддерживается Таблица должна поставляться, когда объект
Эти функции ведут себя как показано здесь: Требования к месту для этих методов показывают в следующей таблице, где
Таблица 2.49. Эти инструкции используются, чтобы ветвиться на основе результата
логического сравнения Использование этих методов требует, чтобы таблица поставлялась когда
объект Длина буфера и продолжительность запроса для каждого из методов,
перечисленных здесь, требует суммы пространства, равного 2 словам плюс ширина
столбца, округленная к самому близкому целому слову: Методы, описанные в этой секции, используются, чтобы сказать транслятору,
что обработка текущей строки завершена и (в случае просмотров)
включать ли эту строку в результаты просмотра. Требования к месту для этих методов показывают в следующей таблице, где
Таблица 2.50. Методы, описанные в этой секции, могут использоваться, чтобы вставить
многоадресные команды (использующие определенные
регистры) в интерпретируемую программу. В дополнение к обновлению столбца таблицы эти методы используют списки
регистров 6 и 7, заменяя любое существующее содержание регистра 6 значениею
первоначального столбца и любое существующее содержание регистра 7 измененным
значением столбца. Сама таблица должна быть ранее определена, создавая
объект Требования к месту для этих методов показывают в следующей таблице, где
Таблица 2.51. Числа определяют, что подпрограммы должны быть смежными,
однако, они не должны быть ни в каком конкретном порядке. Начало подпрограммы обозначается, вызывая метод
Подпрограмму вызывают, используя метод
Как только подпрограмма закончится, выполнение программы продолжится с
инструкции немедленно после той, которая вызвала подпрограмму.
Подпрограммы могут также быть вызваны от других подпрограмм, в настоящее
время максимальная глубина стека подпрограмм равняется 32. Некоторые дополнительные служебные методы, поставляемые
Описание. Это конструктор класса
Сигнатура. Альтернативный конструктор (NDB 8.0.18 и позже). Параметры.
Указатель на Альтернативно, если никакой буфер не будет передан, буфер будет динамично
ассигнован внутренне и расширен пока добавляются инструкции. Возвращаемое значение. Экземпляр
Описание.
Этот метод суммирует значения, сохраненные в любых двух данных регистрах, и
хранит результат в третьем регистре. Сигнатура. Параметры. Этот метод берет три параметра. Первым из них является
регистр, в котором должен быть сохранен результат
( Возможно повторное использоване для хранения результата одного из
регистров, значения которых суммированы, то есть,
Возвращаемое значение.
Описание. Этот метод добавляет указанное значение к значению
данного столбца таблицы и помещает оригинальное и измененное значения
столбцов в регистры 6 и 7. Это эквивалентно следующей серии вызовов
Сигнатура. Этот метод может быть призван любым из двух способов, в
зависимости от того, 32-bit 64-bit Параметры. ID признака столбца таблицы и 32-битное или 64-битное
integer, которое будет добавлено к этому значению столбца. Возвращаемое значение.
Описание. Этот метод используется, чтобы сравнить значение столбца
Сигнатура. Параметры. Указатель на константу
Программная этикетка Возвращаемое значение.
Описание. Этот метод используется, чтобы сравнить столбец
Сигнатура. Параметры. Указатель на константу
Этикетка Возвращаемое значение.
Описание. Этот метод используется, чтобы сравнить
столбец Сигнатура. Параметры. Указатель на константу
Этикетка Возвращаемое значение.
Описание. Этот метод используется, чтобы сравнить
значение Сигнатура. Параметры. Указатель на константу
Этикетка Возвращаемое значение.
Описание. Этот метод сравнивает значение столбца таблицы с
произвольной постоянной и переходит на указанную этикетку программы, если
значения равны. В NDB 8.0.18 и позже, это может также использоваться, чтобы
сравнить две колонки на равенство. Сигнатура. Сравните колонку со значением: Сравните две колонки: Параметры. Сравнивая колонку и значение, этот метод берет
следующие четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно быть сравнено
с Этикетка Сравнивая два значения столбца таблицы, требуемые
параметры показывают здесь: Используя этот метод, чтобы сравнить две колонки, колонки должны иметь
точно тот же самый тип. Возвращаемое значение.
Описание. Этот метод проверяет значение столбца таблицы и
переходит на обозначенную этикетку программы, если значение столбца
Сигнатура. Параметры. Признак ID столбца таблицы. Этикетка программы для перехода, если значение столбца
Возвращаемое значение.
Описание.
Этот метод сравнивает значение столбца таблицы с произвольной постоянной и
переходит на указанную этикетку программы, если значение столбца
соответствует. В NDB 8.0.18 и позже это может также использоваться, чтобы
сравнить две колонки и выполнить переход, если значение первой колонки
больше или равно второй. Сигнатура. Сравните значение с колонкой: Сравните значения двух столбцов: Параметры. Когда используется сравнение значения с колонкой, этот
метод берет эти четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно быть
сравнено с Метод берет параметры, перечисленные здесь, когда используется, чтобы
сравнить две колонки: Сравнивая две колонки, типы столбцов должны быть точно теми же самыми
во всех отношениях. Возвращаемое значение.
Описание. Этот метод сравнивает значение столбца таблицы с
произвольной постоянной и переходит на указанную этикетку программы, если
константа больше, чем значение столбца. В NDB 8.0.18 и позже
этот метод перегружен таким образом, что это может использоваться, чтобы
сравнить два значения столбцов и сделать переход, если первое
больше, чем второе. Сигнатура. Сравните значение с колонкой: Сравните значения двух столбцов: Параметры. Когда используется, чтобы сравнить значение со
столбцом таблицы, этот метод берет следующие четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно
быть сравнено Метод берет эти три параметра, перечисленные здесь, когда используется,
чтобы сравнить две колонки: Сравнивая две колонки, типы столбцов должны быть точно теми же самыми
во всех отношениях. Возвращаемое значение.
Описание. Этот метод сравнивает значение столбца таблицы с
произвольной постоянной и переходит на указанную этикетку программы, если
константа меньше или равна значению столбца.
Начиная с NDB 8.0.18 это может также использоваться, чтобы сравнить два
значения столбца таблицы этим способом. Сигнатура. Сравните значение столбца таблицы с константой: Сравните значения двух столбцов таблицы: Параметры. Сравнивая значение столбца таблицы с константой, этот
метод берет эти четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно быть сравнено с
Метод берет эти три параметра, перечисленные здесь, когда используется,
чтобы сравнить два значения столбца таблицы: Сравнивая две колонки, типы столбцов должны быть точно теми же самыми
во всех отношениях. Возвращаемое значение.
Описание. Этот метод проверяет значение столбца таблицы на
соответствие образцу регулярного выражения и переходит на
обозначенную этикетку программы, если оно соответствует. Сигнатура. Параметры. Образец регулярного выражения
( Длина образца (в байтах). Признак ID для проверяемого столбца таблицы. Этикетка программы, чтобы перейти. Возвращаемое значение.
Описание. Этот метод сравнивает значение столбца таблицы с
произвольной постоянной и переходит на указанную этикетку программы, если
константа меньше, чем значение столбца. В NDB 8.0.18 и позже два значения
столбца таблицы могут быть сравнены вместо этого. Сигнатура. Сравните значение столбца таблицы с константой: Сравните два значения столбца таблицы: Параметры. Сравнивая значение столбца таблицы с константой, этот
метод берет следующие четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно быть сравнено
с Когда используется, чтобьы сравнить два значения столбца таблицы,
Сравнивая два значения столбца таблицы, типы значений столбца таблицы
должны быть точно теми же самыми. Это означает, что у них должны быть та же
самая длина, точность и масштаб. Возвращаемое значение.
Описание. Этот метод сравнивает значение столбца таблицы
с произвольной постоянной и переходит на указанную этикетку программы, если
две значения не равны. В NDB 8.0.18 и позже это может также использоваться,
чтобы сравнить значение столбца таблицы с другим значением столбца
таблицы вместо этого. Сигнатура. Сравните значение столбца таблицы с константой: Сравните два значения столбца таблицы: Параметры. Сравнивая значение столбца таблицы с константой, этот
метод берет эти четыре параметра: Постоянная величина
( Длина значения (в байтах). ID признака столбца таблицы, значение которого должно быть сравнено с
Сравнивая два значения столбца таблицы, требуемые
параметры показывают здесь: Используя этот метод, чтобы сравнить два значения столбца таблицы, колонки
должны иметь точно тот же самый тип. Возвращаемое значение.
Описание. Этот метод проверяет значение столбца таблицы и
переходит на обозначенную этикетку программы, если значение столбца не
Сигнатура. Параметры. Признак ID столбца таблицы. Этикетка для перехода. Возвращаемое значение.
Описание. Этот метод подобен
Сигнатура. Параметры. Образец регулярного выражения
( Длина образца (в байтах). Признак ID для проверяемого столбца таблицы. Этикетка программы для перехода. Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра, если они
равны, интерпретируемая программа переходит к указанной этикетке. Сигнатура. Параметры. Этот метод берет три параметра, регистры, значения
которых должны быть сравнены, это
Возвращаемое значение.
Описание. Этот метод сравнивает значение регистра с
Сигнатура. Параметры. Этот метод берет два параметра: регистр, значение
которого должно быть сравнено с Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра,
если первое больше или равно второму, программа переходит на этикетку. Сигнатура. Параметры. Этот метод берет три параметра:
регистры, значения которых должны быть сравнены
( Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра,
если первое больше, чем второе, программа переходит на этикетку. Сигнатура. Параметры. Этот метод берет три параметра:
регистры, значения которых должны быть сравнены
( Возвращаемое значение.
Описание. Этот метод выполняет безусловный переход к
этикетке программы (см.
раздел 2.3.24.30).
Сигнатура. Параметры. Этот метод берет единственный параметр, этикетку
Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра,
если первое меньше или равно второму, переходит на этикетку. Сигнатура. Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены ( Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра, если первое
меньше, чем второе, переходит на этикетку. Сигнатура. Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены ( Возвращаемое значение.
Описание. Этот метод сравнивает два значения регистра,
если они не равны, то переходит на этикетку. Сигнатура. Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены ( Возвращаемое значение.
Описание. Этот метод сравнивает значение регистра с
Сигнатура. Параметры. Этот метод берет два параметра: регистр, значение
которого должно быть сравнено с Возвращаемое значение.
Описание. Этот метод используется, чтобы вызвать подпрограмму. Сигнатура. Параметры. Этот метод берет единственный параметр, номер,
определяющее подпрограмму, которую вызовут. Возвращаемое значение.
Описание. Делает глубокую копию объекта
Сигнатура. Параметры. Ссылка на копию. Возвращаемое значение. 0 при успехе или код ошибки. Описание. Этот метод определяет этикетку, которая будет
использоваться в качестве цели одного или более переходов в программе. Сигнатура. Параметры. Этот метод берет единственный параметр
Возвращаемое значение.
Описание.
Этот метод используется, чтобы отметить начало подпрограммы. Посмотрите
раздел 2.3.24.1.11. Сигнатура. Параметры. Единственный параметр, номер определенной подпрограммы.
Возвращаемое значение.
Описание. Этот метод готовит интерпретируемую программу, включая
любые подпрограммы, решая все команды ветвления и обращения к подпрограммам.
Это нужно вызвать перед использованием программы и можно вызвать только
однажды для любого данного объекта
Если никакие инструкции не были определены, этот метод пытается вставить
вызов метода
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод возвращает новую ошибку, связанную с этим
объектом Сигнатура. Параметры.
Нет. Возвращаемое значение. Ссылка на объект
Описание. Этот метод может использоваться, чтобы получить ссылку на
таблицу, для который определен объект
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Указатель на объект Описание. Этот метод возвращает количество слов от буфера, которые
использовались, является ли буфер тем, который создан пользователями или
внутренне обеспеченный буфер. Сигнатура. Параметры.
Нет. Возвращаемое значение. 32-битное количество слов в буфере. Описание. Для операции по просмотру вызов этого метода указывает,
что эта строка должна быть возвращена как часть просмотра, и что больше строк
в этом фрагменте не должно быть просмотрено. Для других типов операций метод
заставляет операцию быть прерванной. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Для операций просмотра этот метод используется, чтобы
указать, что текущая строка не должна быть возвращена как часть просмотра, и
программа должна идти дальше к следующей строке. Это заставляет другие типы
операций быть прерванными. Сигнатура. Параметры. Этот метод берет единственный (дополнительный) параметр
До NDB 7.2.1 Возвращаемое значение.
Описание. Для операции по просмотру этот метод указывает,
что текущая строка должна быть возвращена как часть результатов просмотра и
что программа должна идти дальше к следующей строке. Для других операций
вызов этого метода заставляет интерпретируемую программу завершиться. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы загрузить
Сигнатура. Параметры. Этот метод берет единственный параметр: регистр, в
который нужно поместить Возвращаемое значение.
Описание. Этот метод загружает 16-битовое
значение в указанный регистр. Сигнатура. Параметры. Возвращаемое значение.
Описание. Этот метод загружает 32-битовое
значение в указанный регистр. Сигнатура. Параметры. Возвращаемое значение.
Описание. Этот метод загружает 64-битовое
значение в указанный регистр. Сигнатура. Параметры. Возвращаемое значение.
Описание. Метод Сигнатура. Этот метод можно вызвать любым из двух способов.
Первый из них, ссылаясь на колонку по ее ID, как показано здесь: Альтернативно, можно сослаться на колонку как на объект
Параметры. Регистр, в который должно быть скопировано значение столбца
( Любая из следующих ссылок на столбец таблицы, значение которого
должно быть скопировано: Признак столбца таблицы ID
( Указатель на объект Возвращаемое значение.
Описание. Этот метод отмечает конец текущей подпрограммы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод получает различие между значениями,
сохраненными в любых двух данных регистрах, и хранит
результат в третьем регистре. Сигнатура. Параметры. Этот метод берет три параметра. Первым из них является
регистр, в котором должен быть сохранен результат
( Возможно снова использовать один из регистров, значения которых вычтены
для хранения результата, то есть,
Возвращаемое значение.
Описание. Этот метод вычитает указанное значение из значения
данного столбца таблицы и помещает оригинальные и измененные значения
столбцов в регистры 6 и 7. Это эквивалентно следующей серии вызовов
Сигнатура. Этот метод может быть вызван любым из двух способов, в
зависимости от разрядности 32-bit 64-bit Параметры. ID признака столбца таблицы и 32-bit или 64-bit integer
значение, которое будет вычтено из значения этого столбца. Возвращаемое значение.
Описание. Этот метод используется, чтобы скопировать значение
регистра к столбцу таблицы. Столбец может быть определен при помощи признака
ID или как указатель на объект
Сигнатура. Этот метод может быть вызван любым из двух способов.
Первый из них требует ссылки на колонку по признаку ID, как показано здесь:
Можно также сослаться на колонку как на объект
Параметры. Ссылка на столбец таблицы, в который должно быть скопировано
значение регистра. Это может иметь любое значение из следующего: Признак столбца таблицы ID
( Указатель на объект Регистр, значение которого должно быть скопировано
( Возвращаемое значение.
Резюме Эта секция обсуждает класс Родительский класс.
Нет. Дочерние классы.
Описание. Методы. Таблица 2.52. У этого класса нет публичного конструктора. Чтобы создать экземпляр
Типы. Класс Таблица 2.53. См.
раздел 1.3.2.3.2. Описание.
Этот тип используется, чтобы определить, должны ли неудавшиеся операции
вынудить транзакцию быть прерванной. Это используется в качестве аргумента
метода Возможные значения. Таблица 2.54. Операции чтения: Операции просмотра или DML:
См. раздел 2.3.30.6.
Описание. Этот метод определяет
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод определяет условие поиска с равенством.
Условие верно, если у признака есть данное значение. Чтобы установить условия
поиска на многократных признаках, используйте несколько вызовов
Если признак имеет фиксированный размер, его значение должно включать все
байты. В особенности значение Используя Сигнатура. Есть 10 версий Параметры. Первый параметр может иметь любое из следующего: Имя Второй параметр это признак
String 32-bit integer Unsigned 32-bit integer 64-bit integer Unsigned 64-bit integer Возвращаемое значение.
Описание. Этот метод используется вместо
Сигнатура. У этого метода есть две формы, в зависимости от того,
вызывают ли это с именем или ID признака blob: или Параметры. Этот метод берет единственный параметр, который может
быть любой одним из следующего: Возвращаемое значение. Независимо от используемого типа параметра,
это возвращает указатель на экземпляр
Описание. Возвращает указатель на обработчик блокировки текущей
операции. Когда используется с
Использование методов работы с блокировкой.
Коллективные или монопольные блокировки, взятые операциями чтения в
транзакции, обычно действуют, пока транзакция не передает или прерывается.
Такие блокировки могут быть выпущены, прежде чем транзакция передает или
прерывается, вызывая обработчик блокировки, определяя операцию чтения.
Как только операция чтения была выполнена,
Шаги, требуемые, чтобьы выпустить эти блокировки, перечисляются здесь: Определите операцию чтения первичного ключа нормальным способом со
способом блокировки Вызовите
Вызовите
Используйте данные, возможно сделав вызовы
Вызовите
Вызовите
Примечания: Как с другими операционными типами, операции разблокировки
могут быть скомплектованы пакет.
Каждый объект Обработчики блокировки поддерживаются для операций просмотра,
обработчик блокировки нужно требовать, прежде чем блокировка выполняется.
Обработчики блокировки и операции разблокировки не поддерживаются для
операций чтения уникального индекса. Сигнатура. или Параметры.
Нет. Возвращаемое значение.
Указатель на Описание. Этот метод получает способ блокировки операции. Сигнатура. Параметры.
Нет. Возвращаемое значение. Значение
Описание. Этот метод получает новую ошибку (объект
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Объект Описание. Этот метод получает номер
метода, в котором произошла последняя ошибка. Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер метода (integer). Описание. Этот метод используется, чтобы получить
объект таблицы, связанный с операцией. Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на экземпляр
Описание. Этот метод получает
название таблицы, используемой для операции. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название таблицы. Описание. Получает объект
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на объект
Описание. Этот метод используется, чтобы получить
тип доступа для этой операции. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение
Описание. Этот метод готовится к поиску значения атрибута.
API NDB ассигнует память для объекта
Этот метод не получает
значение атрибута из базы данных, объект
Если определенный признак не изменился, соответствующий
См. разделы 2.3.30.6 и
2.3.26.13. Сигнатура. Есть три версии этого метода, каждая
имеющая различные параметры: Параметры. У всех трех форм этого метода есть два параметра, второй
параметр, является дополнительным (по умолчанию
Имя Столбец Во всех трех случаях второй параметр это буфер символов в который
не- Если Если вы передаете указатель отличный от нуля для
Столбцы индекса не могут использоваться вместо столбцов таблицы с этим
методом. В случаях, где столбец таблицы недоступен, можно использовать
название атрибута, полученное с
Возвращаемое значение. Указатель на объект
Получение целых чисел. Значения Integer могут быть получены
от буфера Доступ к битовым значениям.
Следующий пример показывает, как проверить данный бит в буфере
Описание. Этот метод определяет
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот тип описывает способ блокировки, используемый,
выполняя операцию чтения. Возможные значения. Таблица 2.55. Есть также поддержка грязных чтений
( Описание. Этот метод определяет операцию
Сигнатура. Параметры.
Возвращаемое значение.
Описание. Этот метод определяет признак, который будет
установлен или обновлен. Есть много методов
Однако API NDB действительно проверяет, что приложение посылает правильную
длину в интерфейс, как дано в параметре длины. Значение
Чтобы установить значение Когда вы используете Кроме того, необязательно, используя
Сигнатура. Есть 14 версий
Параметры. Этот метод требует следующих двух параметров: Первый параметр определяет признак, который будет установлен и
может быть одним любым из следующего: Имя Второй параметр String ( 32-bit integer Unsigned 32-bit integer 64-bit integer Unsigned 64-bit integer Double Float См. раздел 2.3.25.3. Возвращаемое значение.
Описание. Возможные значения. Таблица 2.56. Описание. Этот метод определяет операцию
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод определяет операцию
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Returns Резюме Секция описывает класс Родительский класс.
Нет. Дочерние классы.
Нет. Описание.
См.
раздел 2.5.1. Объект Методы.
Также возможно получить ссылку на значение независимо от ее фактического
типа, при помощи
Таблица 2.57. У класса Типы. Класс Описание.
Это деструктор класса
Необходимо удалить только копии объектов
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы получить ссылку на
значение атрибута, как указатель на Сигнатура. Параметры. Указатель на значение атрибута. Поскольку этот указатель
постоянный, этот метод можно вызвать в любое время после
Возвращаемое значение.
Нет. Описание. Этот метод получает Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Этот метод создает глубокую копию объекта
Копия, созданная этим методом, должна быть удалена приложением,
когда больше не нужна. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Объект
Описание. Этот метод получает значение
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение double (8 байт). Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение float (4 байта). Описание. Можно использовать этот метод, чтобы получить
размер признака (элемента). Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер признака в байтах как
unsigned 32-bit integer. Описание. Этот метод используется, чтобы получить колонку,
которой принадлежит признак. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Указатель на объект
Описание. Этот метод используется, чтобы получить
тип данных колонки. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение
Описание. Этот метод получает значение
Сигнатура. Параметры.
Нет. Возвращаемое значение.
8-bit signed integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
32-bit signed integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
64-bit signed integer. Описание.
Этот метод проверяет, является ли значение атрибута
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Одно из следующих трех значений: Если
Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
32-bit signed integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
16-bit signed integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
8-bit unsigned integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
32-bit unsigned integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
64-bit unsigned integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
8-bit unsigned Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
32-bit unsigned integer. Описание.
Этот метод получает значение Сигнатура. Параметры.
Нет. Возвращаемое значение.
short (16-bit) unsigned integer. Чтение уникального и первичного ключей. Сканирование таблицы и просмотры индекса. Операции DML, включающие уникальные или первичные ключи. Операции, включающие границы индекса. Тот же самый Следующие члены
Можно также использовать Резюме Эта секция обсуждает класс Родительский класс.
Нет. Дочерние классы.
Нет. Описание. До MySQL 5.1.14 методы сравнения этого класса не работали со значениями
Разработка этого интерфейса продолжается: особенности класса
Методы. Таблица 2.58.
Методы сравнения целого числа NdbScanFilter.
Каждый из этих методов по существу обертка для
Типы. Класс
Описание. Этот метод используется, чтобы начать комплекс и
определяет логический оператор для группировки условий, составляющих
комплекс. По умолчанию Сигнатура. Параметры. Значение Возвращаемое значение.
Описание. Этот тип представляет условие на основе сравнения
значения столбца с некоторым произвольным значением,
то есть, связанное условие. значение этого типа используется в качестве
первого аргумента
Возможные значения. Таблица 2.59. Когда используется в сравнениях с Сравнения строк. Последовательности сравниваются с использованием
Сравнение BIT.
Сравнивающие Описание. Этот метод используется, чтобы определить сравнение между
данным значением и значением колонки. Начиная с NDB 8.0.18, это может также
использоваться, чтобы сравнить две колонки. Этот метод на самом деле не
выполняет сравнение, которое сделано позже, выполняя просмотр для которого
определен этот Во многих случаях, где значение, которое будет сравнено, является целым
числом, можно вместо этого использовать один из нескольких удобных методов,
обеспеченных Сигнатура. Дополнительно в NDB 8.0.18 и позже: Параметры. Когда используется, чтобы сравнить значение с колонкой,
этот метод берет следующие параметры: Значения Используя Таблица 2.60. Чтобы соответствовать литералам
% или _,
используйте наклонную черту влево ( Это те же самые подстановочные символы, которые поддерживаются SQL
Когда используется, чтобы сравнить две колонки,
Колонки, сравниваемые, используя этот метод, должны иметь точно тот же
самый тип. Это включает длину, точность, масштаб и все
другие подробные сведения. Возвращаемое значение.
Этот метод возвращает integer: Описание. Это метод конструктора для
Сигнатура. Параметры. Этот метод берет единственный параметр, указатель на
Возвращаемое значение. Новый экземпляр
Деструктор. Деструктор не берет аргументов и не возвращает
значение. Это нужно вызвать, чтобы удалить объект
Описание. Этот метод заканчивает комплекс, сигнализируя, что больше
нет условий, которые будут добавлены к нему. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы выполнить тест на
равенство значения столбца и целого числа. Сигнатура. или Параметры. ID ( integer с которым нужно сравнить значение столбца, это целое число
может быть 32 бита или 64 бита и в любом случае unsigned. Возвращаемое значение.
Описание. Определяет термин текущей группы как
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы проверить, не является ли
значение столбца Сигнатура. Параметры. ID колонки, значение которой должно быть проверено. Возвращаемое значение.
Описание. Этот метод используется, чтобы проверить, является ли
значение столбца Сигнатура. Параметры. ID колонки, значение которой должно быть проверено. Возвращаемое значение.
Описание. Определяет термин текущей группы как
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы выполнить тест больше чем
или равно на значении столбца и целом числе. Сигнатура. Этот метод принимает 32-битные и 64-битные значения: Параметры.
Аналогично
ID ( integer с которым нужно сравнить значение столбца, это целое число
может составлять 32-bit или 64-bit и всегда unsigned. Возвращаемое значение.
Описание.
Поскольку ошибки, с которыми сталкиваются, строя
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Ссылка на
Описание. Если
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Указатель на
Описание.
Этот тип используется, чтобы описать логические операторы и используется с
методом Возможные значения. Таблица 2.61. Описание. Этот метод используется, чтобы выполнить тест больше
чем (строгая верхняя граница) на значении столбца и целом числе. Сигнатура. Этот метод берет значения 32-bit и 64-bit: Параметры. ID ( integer с которым можно сравнить значение столбца, это целое число
может составлять 32-bit или 64-bit и всегда unsigned. Возвращаемое значение.
Описание. Этот метод используется, чтобы выполнить тест
меньше чем или равно на значении столбца и целом числе. Сигнатура. У этого метода есть два варианта, чтобы обработать
32-битные и 64-битные значения: Параметры. ID ( integer с которым нужно сравнить значение столбца, это целое число
может составлять 32 бита или 64 бита, в любом случае unsigned. Возвращаемое значение.
Описание. Этот метод используется, чтобы провести тест
меньше (строгая нижняя граница) на значении столбца и целом числе. Сигнатура. Параметры. ID ( integer с которым можно сравнить значение столбца, это целое число
может составлять 32-bit или 64-bit и unsigned. Возвращаемое значение.
Описание. Этот метод используется, чтобы выполнить тест на
неравенство на значении столбца и целом числе. Сигнатура. Параметры. ID ( integer с которым нужно сравнить значение столбца, это целое число
может составлять 32 бита или 64 бита и unsigned. Возвращаемое значение.
Резюме Эта секция описывает класс Родительский класс.
Дочерние классы.
Описание.
Класс Методы. Таблица 2.62. У этого класса нет публичного конструктора. Чтобы создать экземпляр
Типы. Этот класс определяет единственный публичный тип
См. разделы 1.3.2.3.3 и
1.3.2.3.4. Описание. Запрос этого метода закрывает просмотр.
Строки, возвращенные этим просмотром, больше недоступны после того, как
просмотр был закрыт, используя этот метод. См.
здесь для получения информации о многократных потоках, пытающихся
выполнить тот же самый просмотр с монопольной блокировкой и как
это может затронуть закрытие просмотров. Сигнатура. Параметры. До NDB 7.2.19 и NDB 7.3.8 буфер, ассигнованный
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы удалить текущий кортеж. Сигнатура. См. раздел 2.3.27. Параметры. Когда используется с интерфейсом
Транзакция ( Строка Дополнительный указатель Таблица 2.63. Дополнительный параметр Если варианты определяются, их длина
( Возвращаемое значение.
Описание. Получает объект
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на объект
Описание. Этот метод используется, чтобы определить, была ли данная
операция по просмотру сокращена к единственному разделению. Для просмотров,
определенных, используя
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод блокирует текущий кортеж. Сигнатура. В MySQL 5.1 и позже этот метод можно вызвать с
дополнительным единственным параметром любым из этих двух способов: Следующая сигнатура также поддерживается для этого метода, используя
Этот метод также поддерживает определение одного или более
Параметры (старый стиль).
Этот метод берет единственный дополнительный параметр: транзакцию, которая
должна выполнить блокировку. Если это опущено, транзакция текущая. Параметры (используя NdbRecord).
Используя интерфейс Транзакция ( Строка Указатель Если варианты определяются, их длина
( Возвращаемое значение. Этот метод возвращает указатель на объект
Описание. Этот метод используется, чтобы получить следующий кортеж
в транзакции просмотра. После каждого вызова
До NDB 7.2.7:
Когда приложение API NDB вызвало этот метод снова после того, как предыдущий
вызов возвратил конец файла (код возврата 1), операционный объект был
потерян и NDB возвращал -1 (неопределенный) (Bug #11748194).
Теперь: Когда
Сигнатура. Этот метод может быть вызван одним из двух способов.
Первый доступен с MySQL 5.1: Также возможно использовать этот метод как показано здесь: Параметры (версия с 2 параметрами).
Этот метод берет следующие два параметра: Обычно API NDB связывается с ядром
Выключение Пока Если вы не передадите записи другой транзакции, блокировки на них будут
выпущены в следующий раз, когда с ядром Выключение Параметры (версия с 3 параметрами).
Этот метод можно также вызвать со следующими тремя параметрами: Вызов Когда false, Установка Возвращаемое значение. Этот метод возвращает одно из следующих 4
integer, интерпретируемых как показано в следующем списке: Пример.
См. раздел 2.5.4. Описание. Этот метод используется, чтобы выполнить просмотр. Сигнатура. Параметры. Режим блокировки
Просмотры с монопольными блокировками.
Просматривая с монопольной блокировкой, нужно соблюдать аккуратность
вследствие того, что, если два потока выполняют этот просмотр одновременно в
том же самом диапазоне, то есть значительная вероятность порождения мертвой
блокировки. Вероятность мертвой блокировки увеличена, если просмотр также
упорядочен (то есть, используя Метод
Одно или более значений Количество фрагментов, чтобы просмотреть в
Параметр Этот параметр был проигнорирован до MySQL 5.1.12,
использовался максимум (Bug #20252). Возвращаемое значение.
Описание. Используйте этот метод, чтобы перезапустить просмотр, не
изменяя ни одного из вызовов Сигнатура. Параметры. Вызовите этот метод с
Возвращаемое значение.
Описание. Значения этого типа флаги просмотра, используемые с
методом Возможные значения. Таблица 2.64. Упорядоченный просмотр индекса (возрастание), строки, возвращенные из
просмотра индекса, сортированы по ключу индекса. Просмотры в порядке по
возрастанию или в порядке по убыванию затронуты этим флагом, который
заставляет API выполнять сортировку слиянием среди упорядоченных
просмотров каждого фрагмента, чтобы получить единственный
сортированный набор результатов. Примечания: Упорядоченные индексы распределяются с одним упорядоченным
индексом для каждого фрагмента таблицы. Просмотры диапазона часто параллельны через все фрагменты индекса.
Иногда они могут быть сокращены к одному фрагменту индекса. Каждый просмотр диапазона фрагмента индекса может возвратить
результаты в порядке по возрастанию или в порядке по убыванию. Возрастание
это умолчание, чтобы выбрать порядок по убыванию, установите флаг
Когда многократные фрагменты индекса просматриваются параллельно,
результаты передают обратно в NDB, где они могут произвольно быть сортированы
слиянием прежде чем быть возвращенным пользователю.
Этой сортировкой слияния управляют, используя флаги
Если не используются
Используя Если просмотр диапазона не сокращен к одному фрагменту
индекса, все фрагменты индекса должны быть просмотрены параллельно.
Неупорядоченный просмотр может быть выполнен с менее
чем полным параллелизмом. Следствия каждого фрагмента индекса должны быть доступными прежде,
чем возвратить любые строки, чтобы гарантировать правильную сортировку
слиянием. Это преобразовывает в последовательную форму
прокуртку просмотра, потенциально приводящую к
более низкой пропускной способности строки. Неупорядоченные просмотры могут возвратить строки
клиенту API, прежде чем все фрагменты индекса возвратили любые пакеты и могут
наложиться на запросы следующего пакета с обработкой строки.
Описание. Этот метод используется, чтобы обновить текущий кортеж.
Сигнатура. Первоначально, этот метод можно было вызвать с
одним дополнительным параметром, любым из способов, показанных здесь: Также возможно использовать этот метод, используя
См. раздел 2.3.27. (Оригинальные) параметры. Этот метод берет единственный
дополнительный параметр: транзакцию, которая должна выполнить блокировку.
Если это опущено, транзакция текущая. Параметры (используя NdbRecord).
Используя интерфейс
Транзакция ( Запись Строка для чтения Указатель Возвращаемое значение. Этот метод возвращает объект
Резюме Эта секция описывает класс Родительский класс.
Нет. Дочерние классы.
Нет. Описание. Транзакция представляется в API NDB объектом
Используя транзакции. После получения объекта
Операция ассигнуется транзакцией, используя любой
из следующих методов: Запрос одного из этих методов определяет операцию. Несколько операций
могут быть определены на том же самом объекте
Метод
Все ассигнованные операции должны быть правильно определены
до вызова метода
В MySQL 5.1.15 и ранее, эти значения были
Методы. Таблица 2.65. Методы
Типы.
Таблица 2.66. Описание.
Этот метод закрывает транзакцию. Это эквивалентно запросу
Если транзакция еще не была передана, она прерывается, когда этот метод
вызывают. Посмотрите раздел
2.3.16.35. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Описание. Этот метод получает статус передачи транзакции. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Этот тип используется, чтобы описать
статус передачи транзакции. Возможные значения. Таблица 2.67. Статус передачи транзакции можно прочитать с помощью метода
Описание. Удаляет кортеж с использованием
Сигнатура. Параметры. Дополнительный параметр Возвращаемое значение. Описание. Этот тип устанавливает тип выполнения транзакции, то
есть, должно ли это выполнить, выполнить и передать или аварийно завершить
работу. Это применяется в качестве параметра метода
Возможные значения. Таблица 2.68. Описание. Этот метод используется, чтобы выполнить транзакцию. Сигнатура. Параметры. Тип выполнения ( Выбор аварийного прекращения работы
(
Ошибки, являющиеся результатом этого метода, найдены с
Параметр См. раздел 1.3.4.
Возвращаемое значение.
В MySQL 5.1.15 и более ранних версиях этот метод вернет
Это означает в случае, где ошибка NoDataFound
возможна, необходимо теперь проверить на нее явно, как
показано в этом примере: Описание. Этот метод выполняет транзакцию с
Сигнатура. Параметры.
Возвращаемое значение.
Описание. Этот метод получает ID глобальной контрольной
точки (GCI) транзакции. Каждая переданная транзакция принадлежит GCI. Регистрация для переданной
транзакции сохранена яна диске, когда глобальная
контрольная точка происходит. Сравнивая GCI транзакции с значением последнего GCI в перезапущенном NDB
Cluster, можно определить, была ли транзакция восстановлена. Была ли глобальная контрольная точка с этим GCI сохранена
на диске, не может быть определено этим методом. GCI для транзакции просмотра не определен, так как никакие обновления не
выполняются в транзакциях просмотра. Сигнатура. Параметры.
Нет. Возвращаемое значение. GCI транзакции или
Никакой GCI не доступен до Описание. Получает текущий пакетный размер в байтах для операций
чтения Сигнатура. Параметры.
Нет. Возвращаемое значение.
Текущий пакетный размер в байтах. См.
раздел
2.3.30.26. Описание. Получает текущий пакетный размер в байтах для
операции записи Сигнатура. Параметры.
Нет. Возвращаемое значение.
Текущий пакетный размер в байтах. Посмотрите
раздел
2.3.30.27. Описание. Этот метод используется, чтобы получить новую ошибку
( Сигнатура. Параметры.
Нет. Возвращаемое значение.
Ссылка на объект
См. раздел 1.3.2.3.6. Описание. Этот метод возвращает номер строки, где
новая ошибка произошла. Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер строки новой ошибки. Для получения дополнительной информации об ошибках из-за неправильного
обращения в транзакциях посмотрите
раздел 1.3.2.3.6. Описание. Этот метод получает операцию, которая вызвала ошибку. Чтобы получить больше информации о фактической ошибке, используйте
метод
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Указатель на
Для получения дополнительной информации об ошибках из-за неправильного
обращения в транзакциях посмотрите
раздел 1.3.2.3.6. Описание. Этот метод используется, чтобы создать
Все операции по индексу в той же самой транзакции должны быть
инициализированы с этим методом. Операции должны быть определены, прежде чем
они будут выполнены. Сигнатура. Параметры. Объект
Возвращаемое значение. Указатель на новый
Описание. Этот метод используется, чтобы создать
Все операции по просмотру индекса в той же самой транзакции должны быть
инициализированы с этим методом. Операции должны быть определены, прежде чем
они будут выполнены. Сигнатура. Параметры.
Объект Возвращаемое значение. Указатель на новый
Описание. Этот метод используется, чтобы создать
Все операции в той же самой транзакции должны быть инициализированы с этим
методом. Операции должны быть определены, прежде чем они будут выполнены. Сигнатура. Параметры.
Объект Возвращаемое значение. Указатель на новый
Описание. Этот метод используется, чтобы создать
Все операции по просмотру в той же самой транзакции должны быть
инициализированы с этим методом. Операции должны быть определены, прежде чем
они будут выполнены. Сигнатура. Параметры. Объект
Возвращаемое значение. Указатель на новый
Описание. Этот метод используется, чтобы получить
законченные действия транзакции. Это, как правило, используется, чтобы
получить все операции, принадлежащие данной транзакции,
чтобы проверить ошибки. Этот метод должен использоваться только после того, как транзакция была
выполнена, но прежде чем транзакция была закрыта. Сигнатура. Параметры. Этот метод требует единственный параметр
Возвращаемое значение.
Операция после Описание. Этот метод используется, чтобы получить ID транзакции. Сигнатура. Параметры.
Нет. Возвращаемое значение.
ID транзакции как unsigned 64-bit integer. Описание. Вставляет кортеж с использованием
Сигнатура. Параметры. Указатель на
Строка ( Указатель на Строка ( Маска Дополнительный параметр Этот метод можно также вызвать, используя одиночный указатель
Возвращаемое значение.
Описание. Этот метод читает кортеж с использованием объектов
Сигнатура. Параметры. Маска, если не
Таблица 2.69. Дополнительный параметр Возвращаемое значение.
Указатель на
Описание. Этот метод обновляет тайм-аут транзакции и таким образом
избегает прерывания из-за тайм-аута транзакции. Нежелательно взять блокировку на записи и поддержать ее в течение
расширенного времени, так как это может повлиять на другие транзакции. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод используется, чтобы выпустить обработчик
блокировки (см. раздел
2.3.25.5), когда это больше не требуется. Для
Все обработчики блокировки, связанные с данной транзакцией, сняты,
когда транзакция закрыта. Сигнатура. Параметры.
Объект Возвращаемое значение.
0 при успехе. Описание. Выполните просмотр диапазона индекса
таблицы с необязательным упорядочиванием. Сигнатура. Параметры. Подобно Чтобы определить равенство связанному, используйте тот же самый указатель
строки для Чтобы определить дополнительные опции, передайте структуру
Для просмотров мультидиапазона указатели Возвращаемое значение.
Текущий
Описание. Этот метод выполняет сканирование таблицы, используя
объект
Сигнатура. Параметры. Указатель на
Опциональный указатель Возвращаемое значение.
Указатель на
Описание.
Устанавливает пакетный размер в байтах для операции чтения
Сигнатура. Параметры. Пакетный размер, как количество байт
Возвращаемое значение.
Нет. Пакетным чтением Описание.
Устанавливает пакетный размер в байтах для операции записи
Сигнатура. Параметры. Пакетный размер, как количество байт
Возвращаемое значение.
Нет. Пакетной записью Описание.
Включает или отключает проверку собственности объекта схемы, когда
многократные объекты
Этот метод доступен для целей отладки, начиная с NDB
7.2.0, NDB 7.3.9 и NDB 7.4.4 (Bug #19875977). Необходимо знать, что
предоставление возможности этой проверки несет потерю производительности, и
поэтому необходимо избегать делать ее в производственном применении. Сигнатура. Параметры. Единственный параметр
Возвращаемое значение.
Нет. Описание.
Этот метод создает операцию разблокировки на текущей транзакции,
когда выполнено, операция удаляет блокировку, на которую ссылаются
Сигнатура. Параметры. Указатель на обработчик блокировки, кроме того,
произвольно,
Если операция терпит неудачу,
Возвращаемое значение.
Указатель на
Описание. Обновляет кортеж, используя объект
Сигнатура. Параметры. Для операций по уникальному индексу,
Дополнительный параметр Возвращаемое значение.
Описание. Этот метод используется с
Сигнатура. Параметры. Для операций по уникальному индексу
Дополнительный параметр Возвращаемое значение.
Резюме Этот класс обеспечивает метаинформацию об объектах базы данных, таких как
таблицы и индексы. Подклассы Родительский класс.
Дочерние классы.
Методы. Таблица 2.70. Все 3 метода чистые виртуальные методы и повторно осуществляются в
подклассах Типы. Таблица 2.71. Резюме Этот тип описывает тип фрагментации
Описание. Этот параметр определяет, как данные в таблице или
индексе распределяются среди узлов хранения кластера, то есть, количество
фрагментов на узел. Чем больше таблица, тем больше количество фрагментов,
которые должны использоваться. Обратите внимание на то, что все точные копии
считаются единственным фрагментом. Для таблицы умолчание
Возможные значения. Таблица 2.72. Описание.
Этот тип обеспечивает параметры настройки баланса разделения (типы количества
фрагмента), из которого можно выбрать, используя
Возможные значения. Таблица 2.73. До NDB 7.5.4 это было известно как
Резюме Этот тип описывает состояние
Описание. Этот параметр предоставляет нам состояние объекта.
По state определяется, создан ли
объект и находится ли в применимом состоянии. Возможные значения. Таблица 2.74. Резюме Этот тип описывает статус
Описание. Чтение объекта Возможные значения. Таблица 2.75. Резюме Этот тип описывает постоянство
Описание. Чтение этой значения говорит нам, временный
или постоянный объект. Возможные значения. Таблица 2.76. Резюме Этот тип описывает тип
Описание. Возможные значения. Таблица 2.77. Описание. Этот метод получает ID объекта. Сигнатура. Параметры.
Нет. Возвращаемое значение. ID объекта как integer. Описание. Этот метод получает
статус объекта, для которого это вызвано. Сигнатура. Параметры.
Нет. Возвращаемое значение. Возвращает текущий
Описание. Метод получает текущую версию объекта. Сигнатура. Параметры.
Нет. Возвращаемое значение. Номер версии объекта как integer. Родительский класс.
Описание. Эти варианты передаются к основанному на
Большинство методов Каждый тип выбора отмечен как существующий, установив соответствующий бит
в Члены. Таблица 2.78.
Принятые имена и значения показывают в следующем списке: См. раздел 2.3.27. Резюме Эта секция описывает структуру
Родительский класс.
Описание. Определенное разделение ID для таблицы с
определенным пользователями разделением. Множество составлено из значений ключа распределения таблицы для
таблицы с родным разделением. Строка в формате
Атрибуты.
Таблица 2.79. Структура UserDefined.
Структура используется, когда Таблица 2.80. Структура KeyPartPtr.
Структура используется, когда Таблица 2.81. Структура KeyRecord.
Структура используется, когда Таблица 2.82.
Определения из Родительский класс.
Описание. Эта структура используется, чтобы определить колонки и
смещения диапазона, создавая объекты
Члены. Таблица 2.83. См. раздел 2.3.27. Родительский класс.
Описание. Эта структура данных используется, чтобы передать
варианты к Все данные копируются из структуры
Члены. Таблица 2.84. См. раздел 2.3.27. Родительский класс.
Описание. Эта структура используется, чтобы определить
дополнительное значение, чтобы установить как часть операции в
Члены. Таблица 2.85. В настоящее время значения blob не могут быть установлены, используя
См. раздел 2.3.27. Резюме Эта секция описывает класс Родительский класс.
Дочерние классы.
Нет. Описание.
Класс Возможное использование API NDB, чтобы составить таблицы независимо от
сервера MySQL. Однако обычно нежелательно это делать, так как таблицы,
составленные этим способом, не могут быть замечены сервером 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. Оператор присваивания ( Как с другими объектами базы данных, создание объекта
Типы. Класс Описание. Добавляет столбец к таблице. Сигнатура. Параметры. Ссылка на колонку, которая должна
быть добавлена к таблице. Возвращаемое значение.
Нет, но
это действительно создает копию оригинального объекта
Описание. Этот метод вычисляет агрегированные данные для таблицы.
Это требуется для таких совокупных методов, как
Добавлено в MySQL 5.1.12 (Bug #21690). Сигнатура. Параметры. Ссылка на объект
Возвращаемое значение. integer, значение которого
Описание. Создает экземпляр
Таблицы, составленные в API NDB, используя этот метод,
недоступны из MySQL. Сигнатура. Новый экземпляр: Конструктор копии: Параметры. Для нового экземпляра, название таблицы, которая будет
создана. Для копии ссылки на таблицу, которая будет скопирована. Возвращаемое значение.
Объект Деструктор. Описание. Этот метод используется, чтобы сравнить один экземпляр
Сигнатура. Параметры. Ссылка на объект
Возвращаемое значение.
Описание. Этот метод используется, чтобы получить определение
столбца, учитывая индекс или название колонки. Сигнатура. Этот метод может быть вызван, используя идентификатор
или имя столбца, как показано здесь: Параметры. Любой из: индекс колонки в таблице (когда это было бы
возвращено методом колонки Возвращаемое значение. Указатель на колонку с указанным индексом
или именем. Если нет такой колонки, то этот метод возвращает
Описание. Этот метод используется, чтобы узнать, используется ли
номер разделения по умолчанию для таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
32-bit unsigned integer. Описание. Получите и распакуйте дополнительные метаданные для этой
Сигнатура. Параметры. Возвращаемое значение.
Добавлено в NDB 8.0.13. Описание. Этот метод получает количество фрагментов в таблице. Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество фрагментов таблицы как
32-bit unsigned integer. Описание. Этот метод получает данные о фрагменте таблицы
(ID, состояние и узел). Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на данные,
которые будут прочитаны. Описание. Получает длину данных о фрагменте таблицы в байтах. Сигнатура. Параметры.
Нет. Возвращаемое значение. Число байтов, которые будут прочитаны как
unsigned 32-bit integer. Описание. Этот метод получает список узлов,
хранящих данный фрагмент. Сигнатура. Параметры. Обычно основной фрагмент это запись 0 в этом множестве. Возвращаемое значение.
Возвращаемое значение Описание. Этот метод получает тип фрагментации таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Данные из файла
Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на данные
Описание.
Получает длину файла Сигнатура. Параметры.
Нет. Возвращаемое значение.
Длина файла Описание. Получает используемую хэш-карту
для этой таблицы. Введено в NDB 7.2.7. Сигнатура. Параметры. ID и версия таблицы. Возвращаемое значение.
True, если у таблицы есть хэш-карта, иначе false. Описание. Этот метод получает KValue, параметр хеширования, который
в настоящее время ограничивается значением Сигнатура. Параметры.
Нет. Возвращаемое значение.
integer (сейчас всегда Описание. Этот метод получает значение линейного
флага хеширования таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот класс используется, чтобы проверить,
зарегистрирована ли таблица на диске, то есть, постоянная она или временная.
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Если Описание. Этот метод возвращает коэффициент загрузки (параметр
хеширования), когда начинается разделение контейнеров в местных хэш-таблицах.
Сигнатура. Параметры.
Нет. Возвращаемое значение. integer, максимальное значение которого
равняется 100. Когда максимальное значение возвращено, это означает, что
использование памяти оптимизировано. Меньшие значения указывают, что меньше
данных хранится в каждом контейнере, что означает, что ключи найдены более
быстро, однако, это также потребляет больше памяти. Описание. Этот метод получает максимальное количество строк,
которые может вместить таблица. Это используется для
вычисления количества разделения. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Максимальное количество строк таблицы как 64-bit unsigned integer. Описание.
Этот метод получает значение коэффициента загрузки, когда сокращение
хэш-таблицы начинается. Это должно всегда быть меньше, чем значение,
возвращенное Сигнатура. Параметры.
Нет. Возвращаемое значение.
integer (на самом деле процент, выраженный как целое число, посмотрите
раздел 2.3.37.19). Описание.
Получает название таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Название таблицы (последовательность). Описание. Этот метод используется, чтобы получить
количество столбцов в таблице. Сигнатура. Параметры.
Нет. Возвращаемое значение.
integer, представляющий количество столбцов в таблице. Описание. Этот метод находит количество столбцов
первичного ключа в таблице. Сигнатура. Параметры.
Нет. Возвращаемое значение. integer, представляющий количество столбцов
первичного ключа в таблице. Описание. Этот метод получает идентификатор объекта таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Идентификатор объекта возвращен как integer. Описание. Этот метод получает статус таблицы, то есть,
Сигнатура. Параметры.
Нет. Возвращаемое значение. A Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Этот метод получает версию объекта таблицы (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта таблицы как integer. Описание. Этот метод получает
схему баланса разделения (тип количества фрагментов). Сигнатура. Параметры.
Нет. Возвращаемое значение.
Схема балансирования разделения как значение типа
До NDB 7.5.4 этот метод был известен как
Описание. Этот метод получает схему баланса разделения (тип
количества фрагментов) и возвращает его как последовательность. Сигнатура. Параметры.
Нет. Возвращаемое значение. Схема балансирования разделения,
как значение последовательности. До NDB 7.5.4 этот метод был известен как
Описание. Получает ID разделения таблицы, данный его
значением хэш-функции. Сигнатура. Параметры. Возвращаемое значение.
Идентификатор разделения, соответствующего
Описание. Этот метод используется, чтобы получить название
первичного ключа таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название первичного ключа,
последовательность (указатель на символ). Описание. Этот метод получает диапазон или данные о
списке, связанные с таблицей. Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на данные. Описание. Этот метод получает размер диапазона таблицы
или множества списка. Сигнатура. Параметры.
Нет. Возвращаемое значение. Длина списка или множества
диапазона как integer. Описание. Проверка, был ли индикатор контрольной
суммы строки установлен. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Проверка, был ли индикатор GCI строки установлен. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Получает однопользовательский режим таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод получает ID таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. integer. Описание. Этот метод используется двумя способами: чтобы получить
название табличного пространства, на которое назначена эта таблица, и чтобы
проверить, что данное табличное пространство это то, которое
используется этой таблицей. Сигнатуры. Чтобы получить название табличного пространства,
вызовите без любых аргументов: Чтобы определить, является ли табличное пространство тем, которое
обозначено данным ID и версией, поставляйте их как аргументы,
как показано здесь: Параметры. Число и типы параметров зависят от того, как
этот метод используется: Когда используется, чтобы получить название табличного
пространства в использовании таблицей, это вызывают без любых аргументов.
Когда используется, чтобы определить, является ли данное табличное
пространство используемым этой таблицей, тогда getTablespace()
берет два параметра: Табличное пространство Табличное пространство Значение по умолчанию для обоих
Возвращаемое значение.
Тип возвращения зависит от того, как метод вызывают. Когда Когда вызвано с двумя аргументами, это возвращает
Описание. Этот метод получает данные о табличном пространстве
таблицы (ID и версия). Сигнатура. Параметры.
Нет. Возвращаемое значение. Указатель на данные. Описание. Этот метод используется, чтобы получить длину данных о
табличном пространстве таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение. Длина данных как 32-bit unsigned integer. Описание. Этот метод получает указатель на названия табличных
пространств, используемых во фрагментах таблицы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Возвращает указатель на данные об имени табличного пространства. Описание. Этот метод получает длину данных об имени табличного
пространства, возвращенных Сигнатура. Параметры.
Нет. Возвращаемое значение. Возвращает длину данных об имени в байтах
как 32-бит unsigned integer. Описание. Используется, чтобы определить, есть ли у таблицы
какие-либо колонки, которые определяются с
не- Чтобы прочитать и написать значения столбцов по умолчанию, надо
использовать
Сигнатура. Параметры.
Нет. Возвращаемое значение.
Описание. Этот метод устанавливает индикатор, который определяет,
используется ли номер разделения по умолчанию для таблицы. Сигнатура. Параметры. Этот метод берет отдельный аргумент
Возвращаемое значение.
Нет. Описание. Сохраните упакованные дополнительные метаданные для этой
таблицы. Данные упакованы без любой модификации в буфер данного объекта
Сигнатура. Параметры. Возвращаемое значение.
Добавлено в NDB 8.0.13. Описание. Определяет число фрагментов таблицы. Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Этот метод пишет множество, содержащее
следующую информацию о фрагменте: Fragment ID Node group ID Fragment State Сигнатура. Параметры. Указатель на фрагмент
Длина ( Возвращаемое значение.
Нет. Описание. Этот метод устанавливает тип фрагментации таблицы. Сигнатура. Параметры. Этот метод берет один аргумент, значение
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы написать данные файла
Сигнатура. Параметры. Указатель на
Длина ( Возвращаемое значение.
Нет. Описание. Установите хэш-карту для таблицы. Введено в NDB 7.2.7. Сигнатура. Параметры. Ссылка на хэш-карту. Возвращаемое значение.
0 при успехе, при ошибке -1 и установит ошибку. Описание. Это устанавливает параметр хеширования
Сигнатура. Параметры. Возвращаемое значение.
Нет. Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Переключает состояние регистрации таблицы. Посмотрите
раздел 2.3.37.18. Сигнатура. Параметры.
Если Возвращаемое значение.
Нет. Описание. Этот метод устанавливает фактор максимальной нагрузки,
разделяя контейнеры в местных хэш-таблицах. Сигнатура. Параметры. Этот метод берет единственный параметр
Это никогда не должно быть больше, чем минимальный коэффициент загрузки.
Возвращаемое значение.
Нет. Описание. Этот метод определяет максимальное число строк, которые
могут быть обработаны таблицей. Сигнатура. Параметры. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает минимальный коэффициент
загрузки, когда сокращение хэш-таблицы начинается. Сигнатура. Параметры. Этот метод берет единственный параметр
Возвращаемое значение.
Нет. Описание. Этот метод определяет имя таблицы. Это единственный метод
Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры. Требуемый объект Возвращаемое значение.
Нет. Описание. Устанавливает схему балансирования разделения таблицы. Сигнатура. Параметры.
Возвращаемое значение.
Нет. До NDB 7.5.4 этот метод был известен как
Описание.
Этот метод устанавливает множество, содержащее информацию, которая
отображает значения диапазона и список значений к фрагментам.
Это по существу сортированная карта, состоящая из пар fragment-ID/value.
Для разделения диапазона есть одна пара на фрагмент. Для разделения списка
это могло быть любое число пар, но по крайней мере столько же пар,
сколько есть фрагментов. Сигнатура. Параметры. Указатель на диапазон или список
Длина ( Возвращаемое значение.
Нет. Описание. Установить индикатор контрольной суммы строки. Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Устанавливает индикатор GCI строки. Сигнатура. Параметры.
Возвращаемое значение.
Нет. Описание. Задает для таблицы
Сигнатура. Параметры.
Знаяение
Возвращаемое значение.
Нет. Описание. Вынуждает статус таблицы быть лишенным законной силы. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает табличное
пространство для таблицы. Сигнатуры. Используя название табличного пространства: Используя объект
Параметры. Этот метод можно вызвать с отдельным аргументом, который
может иметь любой из этих двух типов: Имя Ссылка на существующий экземпляр
См. раздел 2.3.38. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает информацию о табличном
пространстве для каждого фрагмента и включает ID и
версию табличного пространства. Сигнатура. Параметры. Указатель на Длина ( Возвращаемое значение.
Нет. Описание. Определяет имена табличных пространств,
используемых фрагментами таблицы. Сигнатура. Параметры. Указатель на имена табличных пространств
Длина ( Возвращаемое значение.
Нет. Описание. Однопользовательский режим определяет
права доступа к таблице. Возможные значения. Таблица 2.87. Описание. Этот метод утверждает определение для новой
таблицы до того, как это создано и выполняет метод
Даже после вызова Добавлено в MySQL 5.1.12 (Bug #21690). Сигнатура. Параметры. Ссылка на объект
Возвращаемое значение. integer, значение которого
Резюме Эта секция обсуждает класс Родительский класс.
Дочерние классы.
Нет. Описание. Класс В настоящее время только неиндексируемые данные столбца могут
храниться на диске. Индексы и колонки индексов всегда хранятся в памяти. NDB Cluster до MySQL 5.1 не поддерживает хранение Disk Data и
табличные пространства, таким образом класс
Методы. Таблица 2.88. Типы. Класс Tablespace не определяет собственных публичных типов,
однако, два из его методов используют структуру данных
Описание. Эти методы используются, чтобы создать новый экземпляр
Класс
Сигнатуры. Новый экземпляр: Конструктор копии: Параметры. Новый экземпляр:
Нет.
Конструктор копии: ссылка на существующий экземпляр
Возвращаемое значение.
Объект
Деструктор. Класс определяет виртуальный деструктор
Сигнатура. Параметры.
Нет. Возвращаемое значение. Ссылка на структуру, которая описывает
табличное пространство, см.
раздел 2.3.1. Описание. Этот метод получает имя группы
файла журнала табличного пространства по умолчанию. Альтернативно, можно хотеть получить ID группы файла журнала по умолчанию,
посмотрите
раздел 2.3.38.4. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Имя группы файла журнала (указатель на символ). Описание. Этот метод получает ID группы
файла журнала табличного пространства по умолчанию. Можно также получить непосредственно имя группы
файла журнала по умолчанию, а не ее ID, посмотрите
раздел
2.3.38.3. Сигнатура. Параметры.
Нет. Возвращаемое значение. ID группы файла журнала как
unsigned 32-bit integer. Описание. Этот метод используется, чтобы получить
extent size,
который является размером единиц выделения памяти,
используемый табличным пространством. Тот же самый размер используется для всех файлов данных, содержащихся в
данном табличном пространстве. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Размер экстента табличного пространства в байтах как
unsigned 32-bit integer. Описание. Этот метод получает идентификатор
объекта табличного пространства. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта как integer. Описание. Этот метод получает название табличного пространства. Сигнатура. Параметры.
Нет. Возвращаемое значение. Название табличного пространства, значение
последовательности (как указатель на символ). Описание. Этот метод используется, чтобы получить
статус объекта табличного пространства. Сигнатура. Параметры.
Нет. Возвращаемое значение.
Значение Описание. Этот метод получает версию объекта
табличного пространства (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение.
Версия объекта как integer. Описание. Этот метод используется, чтобы установить
особенности табличного пространства. Сигнатура. Параметры. Этот метод берет единственный параметр, структуру данных
Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы установить группу файла
журнала табличного пространства по умолчанию. Сигнатура. Этот метод можно назвать двумя различными способами.
Первый использует имя группы файла журнала, как показано здесь: Этот метод можно также вызвать, передав ему ссылку на объект
Нет никакого метода для установки группы файла журнала как
умолчание для табличного пространства, ссылаясь на ID группы файла журнала.
Другими словами, нет метода
Параметры. Возвращаемое значение.
Нет. Описание. Этот метод устанавливает размер
экстента табличного пространства. Сигнатура. Параметры. Возвращаемое значение.
Нет. Описание. Этот метод определяет имя табличного пространства. Сигнатура. Параметры. Имя Возвращаемое значение.
Нет. Резюме Секция обсуждает класс Родительский класс.
Дочерние классы.
Нет. Описание.
Класс В настоящее время только неиндексируемые данные столбца могут
храниться на диске. Индексы и колонки индексов всегда хранятся в памяти. NDB Cluster до MySQL 5.1 не поддерживает хранение Disk Data и файлы отмен,
поэтому класс Методы. Таблица 2.89. Типы. Класс Описание. Конструктор класса может использоваться, чтобы создать
новый экземпляр Сигнатуры. Создает новый экземпляр: Конструктор копии: Параметры. Новый экземпляр: Нет
. Конструктор копии: берет отдельный аргумент, ссылку на копируемый
Возвращаемое значение.
Объект
Деструктор. Класс определяет виртуальный деструктор, который не
берет аргументов и имеет тип возвращения Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры.
Нет. Возвращаемое значение. Количество файлов отмен как
unsigned 32-bit integer. Описание. Этот метод получает имя группы файла журнала, которой
принадлежит файл отмен. Сигнатура. Параметры.
Нет. Возвращаемое значение. Имя группы файла журнала, значение
последовательности (как указатель на символ). Описание. Этот метод получает ID группы файла журнала, которой
принадлежит файл отмен. Также возможно получить имя группы файла журнала непосредственно.
Посмотрите раздел
2.3.39.3 Сигнатура. Параметры.
Нет. Возвращаемое значение.
ID группы файла журнала как unsigned 32-bit integer. Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры.
Нет. Возвращаемое значение.
ID узла как unsigned 32-bit integer. Описание. Этот метод получает
идентификатор объекта файла отмен. Сигнатура. Параметры.
Нет. Возвращаемое значение. Идентификатор объекта как integer. Описание. Этот метод используется, чтобы получить
статус объекта файла отмен. Сигнатура. Параметры.
Нет. Возвращаемое значение. Значение
Описание. Этот метод получает версию объекта файла отмен (см.
NDB Schema Object Versions). Сигнатура. Параметры.
Нет. Возвращаемое значение. Версия объекта как integer. Описание. Этот метод получает путь, соответствующий местоположению
файла отмен в файловой системе узла данных. Сигнатура. Параметры.
Нет. Возвращаемое значение. Путь файловой системы
(как указатель на символ). Описание. Этот метод получает размер файла отмен в байтах. Сигнатура. Параметры.
Нет. Возвращаемое значение. Размер в байтах файла отмен как
unsigned 64-bit integer. Описание. Учитывая имя или ссылку на объект группы файла журнала
метод Сигнатура. Используя название группы файла журнала: Используя ссылку на экземпляр
Параметры.
Имя Возвращаемое значение.
Нет. Описание. Этот метод не работал, как предназначено и был удален в
NDB 7.5.0 (Bug #47960, Bug #11756088). Сигнатура. Параметры. Возвращаемое значение.
Нет. Описание. Этот метод используется, чтобы установить путь файловой
системы файла отмен на узле данных, где это находится. Сигнатура. Параметры. Желаемый путь Возвращаемое значение.
Нет. Описание. Устанавливает размер файла отмен в байтах. Сигнатура. Параметры. Намеченный размер Возвращаемое значение.
Нет. Резюме Эта секция содержит обсуждение обработки ошибок в приложениях NDB API
а также списки листингов наиболее распространенных кодов ошибок и сообщений
Для получения информации о структуре
Сильно рекомендуется, чтобы вы НЕ
зависели от определенных кодов ошибок в вашем приложении
Если вы находите ситуацию, в которой необходимо использовать определенный
код ошибки, пожалуйста, подайте отчет об ошибках на
http://bugs.mysql.com/, чтобы мы могли обновить
соответствующий статус и классификацию. Резюме Эта секция описывает, как ошибки API NDB могут быть обнаружены и
отображены на конкретные операции. NDB API можно получить любым из двух способов: Когда операция определяется Когда операция выполняется Ошибки во время операционного определения.
Ошибки, произведенные во время операционного определения, приводят к коду
возврата неудачи из названного метода. Фактическая ошибка может быть
определена, исследовав соответствующий объект
Ошибки во время операционного выполнения.
Ошибки, происходящие во время операционного выполнения, вызывают прерывание
транзакции, если опция По умолчанию операции чтения работают с
Необходимо также знать, что использование
Чтение с Во всех экземплярах, где определенные для операции ошибки возникают,
ошибка выполнения с операцией отмечена для операции и связанного
операционного объекта. Где есть многократные операционные ошибки на
одном вызове
Также возможно для ошибок произойти во время выполнения, например,
неудача узла данных, такие ситуации отмечены для операционного объекта, но
не для основных объектов операции.
Это вызвано тем, что эти ошибки относятся к транзакции в целом, а не к
отдельным операциям в транзакции. Поэтому приложения должны использовать
Неявный вызов NdbTransaction::execute() в методах BLOB и просмотре.
Операции по просмотру выполняются таким же образом как другие операции, и
также имеют неявный вызов Некоторые методы обработки Резюме. В целом для ошибки возможно произойти во время выполнения
(приводя к коду возврата неудачи), вызывая любой из следующих методов:
Этот метод не выполняет неявный
Если это происходит, метод
Когда Пример (pseudocode).
Мы начинаем, выполняя транзакцию, которая, возможно, скомплектовала операции
установила опции Для числа и разрешенных значений
Затем, потому что ошибки в операциях с
Ненулевое значение для кода ошибки означает, что ошибка была поднята в
транзакции. Это могло произойти из-за любого из следующих условий: Ошибка всей транзакции, такая как неудача узла данных, которая
заставила транзакцию быть прерванной Единственная определенная для операции ошибка, такая как
ограничительное нарушение, которое заставило транзакцию быть прерванной
Единственная определенная для операции проигнорированная ошибка, такая
как ек найденные данные, которая не заставила транзакцию быть прерванной
Первая из многих определенных для операции проигнорированных ошибок,
таких как данные не найдены, которая не заставила транзакцию быть прерванной
Первая из многих определенных для операции проигнорированных ошибок,
таких как не найденные данные перед операционной ошибкой
прерывания (прерванная транзакция) Транзакция была прервана. Рекомендуемая стратегия обработки ошибки в этом
случае состоит в том, чтобы проверить операционный ошибочный статус и принять
соответствующие меры на основе его значения: Так как транзакция была прервана, вообще необходимо пройти
по законченным операциям (если таковые имеются) и учесть ошибки, поднятые
каждой операцией, только если вы хотите сделать так для сообщения о причинах.
Сама транзакция не была прервана, но должна быть одна или несколько
проигнорированных ошибок. В этом случае необходимо пройти по операциям, чтобы
определить, что произошло и обращаться с причиной соответственно. Чтобы обработать
Для числа и разрешенных значений
Во-первых, необходимо проверить объект
Если никакая ошибка не была найдена в операции по просмотру, ошибка должна
принадлежать всей транзакции. Теперь можно обработать ошибку на основе ошибочного статуса: Для получения информации об ошибочных классификационных кодах API NDB и
кодах статусов посмотрите
раздел 2.4.4. В то время как вы не должны полагаться на определенный код
ошибки или текст сообщения в ваших приложениях API NDB,
коды ошибок и сообщения подлежат изменению со временем, может быть полезно
проверить коды ошибок и сообщения, чтобы помочь определить, почему произошла
конкретная неудача. Для получения дополнительной информации о них, посмотрите
раздел 2.4.2. Для подробностей о
Эта секция содержит много списков кодов ошибок, один для каждого типа
ошибки API NDB. Ошибочные типы включают следующее: Нет ошибки Ошибка приложения Ошибка приложения просмотра Конфигурация или ошибка приложения Никакие данные не найдены Ограничительное нарушение Ошибка схемы Пользователь определил ошибку Недостаточно места Временная ошибка ресурса Ошибка восстановления узла Ошибка перегрузки Тайм-аут кончился Закрытие узла Внутренний временный сбой Неизвестная ошибка результата Неизвестный (в настоящее время неиспользованный) код ошибки Внутренняя ошибка Функция не реализована Информация в каждом списке включает для каждой ошибки: Код ошибки NDB Соответствующий код ошибки MySQL Классификационный код NDB См. раздел 2.4.4
для значений этих классификационных кодов. Текст сообщения об ошибке Подобные ошибки сгруппированы в каждом списке.
Каждый список упорядочен в алфавитном порядке. Можно всегда получать последние коды ошибок и информацию от файла
Эти типы также показывают в столбце
Ошибка MySQL. 0 Сообщение об ошибке. No error Ошибка MySQL. DMEC Сообщение об ошибке. Table read-only Ошибка MySQL. DMEC Сообщение об ошибке. A backup is already running Ошибка MySQL. DMEC Сообщение об ошибке.
Backup not supported in diskless mode (change Diskless) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup during software upgrade not supported Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to allocate buffers (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to setup fs buffers (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to allocate tables (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to insert file header (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to insert table list (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to allocate table memory (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to allocate file record (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке.
Backup failed to allocate attribute record (check configuration) Ошибка MySQL. DMEC Сообщение об ошибке. Node already reserved Ошибка MySQL. DMEC Сообщение об ошибке. Node already connected Ошибка MySQL. DMEC Сообщение об ошибке. Node type mismatch Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN Сообщение об ошибке.
Create foreign key failed - parent key is primary key and
on-update-cascade is not allowed Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN Сообщение об ошибке.
Create foreign key failed in NDB - parent index is not unique index Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN Сообщение об ошибке.
Create foreign key failed in NDB - No parent row found Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN Сообщение об ошибке.
Create foreign key failed - child table has Blob or Text
column and on-delete-cascade is not allowed Ошибка MySQL. DMEC Сообщение об ошибке.
Drop foreign key failed in NDB - foreign key not found Ошибка MySQL. DMEC Сообщение об ошибке.
Build foreign key failed in NDB - foreign key not found Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED Сообщение об ошибке.
Drop table not allowed in NDB - referenced by foreign key
on another table Ошибка MySQL. HA_ERR_DROP_INDEX_FK Сообщение об ошибке.
Drop index not allowed in NDB - used as parent index
of a foreign key Ошибка MySQL. HA_ERR_DROP_INDEX_FK Сообщение об ошибке.
Drop index not allowed in NDB - used as child index of a foreign key Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN Сообщение об ошибке.
Create foreign key failed in NDB - name
contains invalid character (/) Ошибка MySQL. DMEC Сообщение об ошибке. Zero concurrency in scan Ошибка MySQL. DMEC Сообщение об ошибке. Too high concurrency in scan Ошибка MySQL. DMEC Сообщение об ошибке.
DML count in transaction exceeds config parameter
MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations Ошибка MySQL. DMEC Сообщение об ошибке.
No condition and attributes to read in scan Ошибка MySQL. HA_ERR_NO_CONNECTION Сообщение об ошибке.
Operation not allowed due to cluster shutdown in progress Ошибка MySQL. DMEC Сообщение об ошибке.
Operation not allowed or aborted due to single user mode Ошибка MySQL. DMEC Сообщение об ошибке.
Undefined partition used in setPartitionId Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid no of nodes specified for new nodegroup Ошибка MySQL. DMEC Сообщение об ошибке. Invalid nodegroup id Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, node
already in nodegroup Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid nodegroup id, nodegroup already existing Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, no node in
nodegroup is started Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, node ID
invalid or undefined Ошибка MySQL. DMEC Сообщение об ошибке.
Attribute name or id not found in the table Ошибка MySQL. DMEC Сообщение об ошибке. Status Error in NDB Ошибка MySQL. DMEC Сообщение об ошибке.
No connections to NDB available and connect failed Ошибка MySQL. DMEC Сообщение об ошибке.
Type in NdbTamper not correct Ошибка MySQL. DMEC Сообщение об ошибке.
No schema connections to NDB available and connect failed Ошибка MySQL. DMEC Сообщение об ошибке.
Ndb Init in wrong state, destroy Ndb object and create a new Ошибка MySQL. DMEC Сообщение об ошибке. Too many Ndb objects Ошибка MySQL. DMEC Сообщение об ошибке.
All Not NULL attribute have not been defined Ошибка MySQL. DMEC Сообщение об ошибке. Transaction is already completed Ошибка MySQL. DMEC Сообщение об ошибке.
Operation was not defined correctly, probably missing a key Ошибка MySQL. DMEC Сообщение об ошибке.
Could not start transporter, configuration error Ошибка MySQL. DMEC Сообщение об ошибке.
Parameter error in API call Ошибка MySQL. DMEC Сообщение об ошибке. Scan already complete Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot set name twice for an Ndb object Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot set name after Ndb object is initialised Ошибка MySQL. DMEC Сообщение об ошибке.
Free percent out of range. Allowed range is 1-99 Ошибка MySQL. DMEC Сообщение об ошибке.
Bad operation reference - double unlock Ошибка MySQL. DMEC Сообщение об ошибке.
Status Error when defining an operation Ошибка MySQL. DMEC Сообщение об ошибке. Variable Arrays not yet supported Ошибка MySQL. DMEC Сообщение об ошибке.
Set value on tuple key attribute is not allowed Ошибка MySQL. DMEC Сообщение об ошибке.
Trying to set a NOT NULL attribute to NULL Ошибка MySQL. DMEC Сообщение об ошибке.
Set value and Read/Delete Tuple is incompatible Ошибка MySQL. DMEC Сообщение об ошибке.
No Key attribute used to define tuple Ошибка MySQL. DMEC Сообщение об ошибке.
Not allowed to equal key attribute twice Ошибка MySQL. DMEC Сообщение об ошибке. Key size is limited to 4092 bytes Ошибка MySQL. DMEC Сообщение об ошибке. Trying to read a non-stored attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Length parameter in equal/setValue is incorrect Ошибка MySQL. DMEC Сообщение об ошибке.
Ndb sent more info than the length he specified Ошибка MySQL. DMEC Сообщение об ошибке.
Inconsistency in list of NdbRecAttr-objects Ошибка MySQL. DMEC Сообщение об ошибке.
Ndb reports NULL value on Not NULL attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Not all data of an attribute has been received Ошибка MySQL. DMEC Сообщение об ошибке.
Not all attributes have been received Ошибка MySQL. DMEC Сообщение об ошибке.
More data received than reported in TCKEYCONF message Ошибка MySQL. DMEC Сообщение об ошибке.
More than 8052 bytes in setValue cannot be handled Ошибка MySQL. DMEC Сообщение об ошибке.
It is not allowed to increment any other than unsigned ints Ошибка MySQL. DMEC Сообщение об ошибке.
Currently not allowed to increment NULL-able attributes Ошибка MySQL. DMEC Сообщение об ошибке.
Maximum size of interpretative attributes are 64 bits Ошибка MySQL. DMEC Сообщение об ошибке.
Maximum size of interpretative attributes are 64 bits Ошибка MySQL. DMEC Сообщение об ошибке.
Trying to jump to a non-defined label Ошибка MySQL. DMEC Сообщение об ошибке. Label was not found, internal error Ошибка MySQL. DMEC Сообщение об ошибке.
Not allowed to create jumps to yourself Ошибка MySQL. DMEC Сообщение об ошибке.
Not allowed to jump to a label in a different subroutine Ошибка MySQL. DMEC Сообщение об ошибке.
All primary keys defined, call setValue/getValue Ошибка MySQL. DMEC Сообщение об ошибке. Bad number when defining a label Ошибка MySQL. DMEC Сообщение об ошибке. Bad number when defining a subroutine Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal interpreter function in scan definition Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal register in interpreter function definition Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal state when calling getValue, probably not a read Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal state when calling interpreter routine Ошибка MySQL. DMEC Сообщение об ошибке.
Parallelism can only be between 1 and 240 Ошибка MySQL. DMEC Сообщение об ошибке.
Calling execute (synchronous) when already prepared
asynchronous transaction exists Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal to call setValue in this state Ошибка MySQL. DMEC Сообщение об ошибке. No callback from execute Ошибка MySQL. DMEC Сообщение об ошибке. Trigger name too long Ошибка MySQL. DMEC Сообщение об ошибке. Too many triggers Ошибка MySQL. DMEC Сообщение об ошибке. Trigger not found Ошибка MySQL. DMEC Сообщение об ошибке. Trigger with given name already exists Ошибка MySQL. DMEC Сообщение об ошибке. Unsupported trigger type Ошибка MySQL. DMEC Сообщение об ошибке. Index name too long Ошибка MySQL. DMEC Сообщение об ошибке. Too many indexes Ошибка MySQL. DMEC Сообщение об ошибке. Index not found Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal index/trigger create/drop/alter request Ошибка MySQL. DMEC Сообщение об ошибке. Trigger/index name invalid Ошибка MySQL. DMEC Сообщение об ошибке. Invalid table Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid index type or index logging option Ошибка MySQL. HA_ERR_FOUND_DUPP_UNIQUE Сообщение об ошибке.
Cannot create unique index, duplicate keys found Ошибка MySQL. DMEC Сообщение об ошибке. Failed to allocate space for index Ошибка MySQL. DMEC Сообщение об ошибке. Failed to create index table Ошибка MySQL. DMEC Сообщение об ошибке. Table not an index table Ошибка MySQL. DMEC Сообщение об ошибке. Hash index attributes must be specified
in same order as table attributes Ошибка MySQL. DMEC Сообщение об ошибке.
Must call Ndb::init() before this function Ошибка MySQL. DMEC Сообщение об ошибке.
Tried to read too much - too many getValue calls Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot create unique index, duplicate attributes found in definition Ошибка MySQL. DMEC Сообщение об ошибке. Invalid set of range scan bounds Ошибка MySQL. DMEC Сообщение об ошибке. Invalid usage of blob attribute Ошибка MySQL. DMEC Сообщение об ошибке.
The method is not valid in current blob state Ошибка MySQL. DMEC Сообщение об ошибке. Invalid blob seek position Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid index object, not retrieved via getIndex() Ошибка MySQL. DMEC Сообщение об ошибке. Table definition has undefined column Ошибка MySQL. DMEC Сообщение об ошибке.
The blob method is incompatible with operation type or lock mode Ошибка MySQL. DMEC Сообщение об ошибке.
Missing NULL ptr in end of keyData list Ошибка MySQL. DMEC Сообщение об ошибке. Key part len is to small for column Ошибка MySQL. DMEC Сообщение об ошибке. Supplied buffer to small Ошибка MySQL. DMEC Сообщение об ошибке. Malformed string Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistent key part length Ошибка MySQL. DMEC Сообщение об ошибке.
Too many keys specified for key bound in scanIndex Ошибка MySQL. DMEC Сообщение об ошибке.
range_no not strictly increasing in ordered multi-range index scan Ошибка MySQL. DMEC Сообщение об ошибке.
key_record in index scan is not an index ndbrecord Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot mix NdbRecAttr and NdbRecord methods in one operation Ошибка MySQL. DMEC Сообщение об ошибке. NULL NdbRecord pointer Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid range_no (must be < 4096) Ошибка MySQL. DMEC Сообщение об ошибке.
The key_record and attribute_record in primary key
operation do not belong to the same table Ошибка MySQL. DMEC Сообщение об ошибке.
Blob handle for column not available Ошибка MySQL. DMEC Сообщение об ошибке.
API version mismatch or wrong
sizeof(NdbDictionary::RecordSpecification) Ошибка MySQL. DMEC Сообщение об ошибке.
Missing column specification in
NdbDictionary::RecordSpecification Ошибка MySQL. DMEC Сообщение об ошибке.
Duplicate column specification in
NdbDictionary::RecordSpecification Ошибка MySQL. DMEC Сообщение об ошибке.
NdbRecord for tuple access is not an index key NdbRecord Ошибка MySQL. DMEC Сообщение об ошибке.
Error returned from application scanIndex() callback Ошибка MySQL. DMEC Сообщение об ошибке.
Scan filter is too large, discarded Ошибка MySQL. DMEC Сообщение об ошибке.
Column is NULL in Get/SetValueSpec structure Ошибка MySQL. DMEC Сообщение об ошибке. Invalid AbortOption Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid or unsupported OperationOptions structure Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid or unsupported ScanOptions structure Ошибка MySQL. DMEC Сообщение об ошибке.
Incorrect combination of ScanOption flags, extraGetValues
ptr and numExtraGetValues Ошибка MySQL. DMEC Сообщение об ошибке. Tuple Key Type not correct Ошибка MySQL. DMEC Сообщение об ошибке. Fragment Type not correct Ошибка MySQL. DMEC Сообщение об ошибке. Minimum Load Factor not correct Ошибка MySQL. DMEC Сообщение об ошибке. Maximum Load Factor not correct Ошибка MySQL. DMEC Сообщение об ошибке.
Maximum Load Factor smaller than Minimum Ошибка MySQL. DMEC Сообщение об ошибке. K value must currently be set to 6 Ошибка MySQL. DMEC Сообщение об ошибке. Memory Type not correct Ошибка MySQL. DMEC Сообщение об ошибке. Invalid table name Ошибка MySQL. DMEC Сообщение об ошибке. Attribute Size not correct Ошибка MySQL. DMEC Сообщение об ошибке.
Fixed array too large, maximum 64000 bytes Ошибка MySQL. DMEC Сообщение об ошибке. Attribute Type not correct Ошибка MySQL. DMEC Сообщение об ошибке. Storage Mode not correct Ошибка MySQL. DMEC Сообщение об ошибке. Null Attribute Type not correct Ошибка MySQL. DMEC Сообщение об ошибке.
Index only storage for non-key attribute Ошибка MySQL. DMEC Сообщение об ошибке. Storage Type of attribute not correct Ошибка MySQL. DMEC Сообщение об ошибке.
No more key attributes allowed after defining variable
length key attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Key attributes are not allowed to be NULL attributes Ошибка MySQL. DMEC Сообщение об ошибке.
Too many primary keys defined in table Ошибка MySQL. DMEC Сообщение об ошибке. Invalid attribute name or number Ошибка MySQL. DMEC Сообщение об ошибке.
createAttribute called at erroneus place Ошибка MySQL. DMEC Сообщение об ошибке.
Attempt to define distribution key when not prepared to Ошибка MySQL. DMEC Сообщение об ошибке.
Distribution Key set on table but not defined on first attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Attempt to define distribution group when not prepared to Ошибка MySQL. DMEC Сообщение об ошибке.
Distribution Group set on table but not defined on first attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Distribution Group with erroneus number of bits Ошибка MySQL. DMEC Сообщение об ошибке.
Distribution key is only supported on part of primary key Ошибка MySQL. DMEC Сообщение об ошибке.
Disk memory attributes not yet supported Ошибка MySQL. DMEC Сообщение об ошибке.
Variable stored attributes not yet supported Ошибка MySQL. DMEC Сообщение об ошибке.
Only one autoincrement column allowed per table. Having a
table without primary key uses an autoincremented hidden key, i.e. a table
without a primary key can not have an autoincremented column Ошибка MySQL. DMEC Сообщение об ошибке.
Result or attribute record must be a base table ndbrecord,
not an index ndbrecord Ошибка MySQL. DMEC Сообщение об ошибке.
Not all keys read when using option SF_OrderBy Ошибка MySQL. DMEC Сообщение об ошибке. Scan defined but not prepared Ошибка MySQL. DMEC Сообщение об ошибке.
Table with blobs does not support refresh Ошибка MySQL. DMEC Сообщение об ошибке. Status Error in NdbSchemaCon Ошибка MySQL. DMEC Сообщение об ошибке.
Only one schema operation per schema transaction Ошибка MySQL. DMEC Сообщение об ошибке.
No schema operation defined before calling execute Ошибка MySQL. DMEC Сообщение об ошибке.
Schema transaction is already started Ошибка MySQL. DMEC Сообщение об ошибке.
Schema transaction not possible until upgrade complete Ошибка MySQL. DMEC Сообщение об ошибке. Schema transaction is not started Ошибка MySQL. DMEC Сообщение об ошибке.
Insert in hash table failed when getting table information from Ndb Ошибка MySQL. DMEC Сообщение об ошибке.
GetValue not allowed in Update operation Ошибка MySQL. DMEC Сообщение об ошибке.
GetValue not allowed in Insert operation Ошибка MySQL. DMEC Сообщение об ошибке.
SetValue not allowed in Read operation Ошибка MySQL. DMEC Сообщение об ошибке.
NULL value not allowed in primary key search Ошибка MySQL. DMEC Сообщение об ошибке.
Missing getValue/setValue when calling execute Ошибка MySQL. DMEC Сообщение об ошибке.
Missing operation request when calling execute Ошибка MySQL. DMEC Сообщение об ошибке.
GetValue not allowed for NdbRecord defined operation Ошибка MySQL. DMEC Сообщение об ошибке.
Non SF_MultiRange scan cannot have more than one bound Ошибка MySQL. DMEC Сообщение об ошибке.
User specified partition id not allowed for scan takeover operation Ошибка MySQL. DMEC Сообщение об ошибке.
Blobs not allowed in NdbRecord delete result record Ошибка MySQL. DMEC Сообщение об ошибке.
Incorrect combination of OperationOptions optionsPresent,
extraGet/SetValues ptr and numExtraGet/SetValues Ошибка MySQL. DMEC Сообщение об ошибке.
Only one scan bound allowed for non-NdbRecord setBound() API Ошибка MySQL. DMEC Сообщение об ошибке.
Can only call setBound/equal() for an NdbIndexScanOperation Ошибка MySQL. DMEC Сообщение об ошибке.
Method not allowed for NdbRecord, use OperationOptions or
ScanOptions structure instead Ошибка MySQL. DMEC Сообщение об ошибке.
Illegal instruction in interpreted program Ошибка MySQL. DMEC Сообщение об ошибке. Bad label in branch instruction Ошибка MySQL. DMEC Сообщение об ошибке.
Too many instructions in interpreted program Ошибка MySQL. DMEC Сообщение об ошибке.
NdbInterpretedCode::finalise() not called Ошибка MySQL. DMEC Сообщение об ошибке. Call to undefined subroutine Ошибка MySQL. DMEC Сообщение об ошибке.
Call to undefined subroutine, internal error Ошибка MySQL. DMEC Сообщение об ошибке. setBound() called twice for same key Ошибка MySQL. DMEC Сообщение об ошибке.
Pseudo columns not supported by NdbRecord Ошибка MySQL. DMEC Сообщение об ошибке.
NdbInterpretedCode is for different table Ошибка MySQL. DMEC Сообщение об ошибке.
Attempt to set bound on non key column Ошибка MySQL. DMEC Сообщение об ошибке.
NdbScanFilter constructor taking NdbOperation is not
supported for NdbRecord Ошибка MySQL. DMEC Сообщение об ошибке.
Wrong API. Use NdbInterpretedCode for NdbRecord operations Ошибка MySQL. DMEC Сообщение об ошибке.
NdbInterpretedCode instruction requires that table is set Ошибка MySQL. DMEC Сообщение об ошибке.
NdbInterpretedCode not supported for operation type Ошибка MySQL. DMEC Сообщение об ошибке.
Attempt to pass an Index column to createRecord.
Use base table columns only Ошибка MySQL. DMEC Сообщение об ошибке. Unknown partition information type Ошибка MySQL. DMEC Сообщение об ошибке.
Duplicate partitioning information supplied Ошибка MySQL. DMEC Сообщение об ошибке. Wrong partitionInfo type for table Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid or Unsupported PartitionInfo structure Ошибка MySQL. DMEC Сообщение об ошибке.
Explicit partitioning info not allowed for table and operation Ошибка MySQL. DMEC Сообщение об ошибке.
RecordSpecification has overlapping offsets Ошибка MySQL. DMEC Сообщение об ошибке.
RecordSpecification has too many elements Ошибка MySQL. DMEC Сообщение об ошибке.
getLockHandle only supported for primary key read with a lock Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot releaseLockHandle until operation executed Ошибка MySQL. DMEC Сообщение об ошибке. NdbLockHandle already released Ошибка MySQL. DMEC Сообщение об ошибке.
NdbLockHandle does not belong to transaction Ошибка MySQL. DMEC Сообщение об ошибке.
NdbLockHandle original operation not executed successfully Ошибка MySQL. DMEC Сообщение об ошибке.
NdbBlob can only be closed from Active state Ошибка MySQL. DMEC Сообщение об ошибке.
NdbBlob cannot be closed with pending operations Ошибка MySQL. DMEC Сообщение об ошибке.
RecordSpecification has illegal value in column_flags Ошибка MySQL. DMEC Сообщение об ошибке.
Column types must be identical when comparing two columns Ошибка MySQL. DMEC Сообщение об ошибке. Transaction is already started Ошибка MySQL. DMEC Сообщение об ошибке. Transaction is not started Ошибка MySQL. DMEC Сообщение об ошибке.
You must call getNdbOperation before executeScan Ошибка MySQL. DMEC Сообщение об ошибке.
There can only be ONE operation in a scan transaction Ошибка MySQL. DMEC Сообщение об ошибке.
takeOverScanOp, to take over a scanned row one must
explicitly request keyinfo on readTuples call Ошибка MySQL. DMEC Сообщение об ошибке.
You may only call readTuples() once for each operation Ошибка MySQL. DMEC Сообщение об ошибке.
There may only be one operation in a scan transaction Ошибка MySQL. DMEC Сообщение об ошибке.
You can not takeOverScan unless you have used openScanExclusive Ошибка MySQL. DMEC Сообщение об ошибке.
You must call nextScanResult before trying to takeOverScan Ошибка MySQL. DMEC Сообщение об ошибке. Too many event have been defined Ошибка MySQL. DMEC Сообщение об ошибке. Event name is too long Ошибка MySQL. DMEC Сообщение об ошибке. Can't accept more subscribers Ошибка MySQL. DMEC Сообщение об ошибке. Event not found Ошибка MySQL. DMEC Сообщение об ошибке. Creation of event failed Ошибка MySQL. DMEC Сообщение об ошибке.
Stopped event operation does not exist. Already stopped? Ошибка MySQL. DMEC Сообщение об ошибке.
Index stats sys tables NDB_INDEX_STAT_PREFIX do not exist Ошибка MySQL. DMEC Сообщение об ошибке.
Index stats for specified index do not exist Ошибка MySQL. DMEC Сообщение об ошибке. Index stats methods usage error Ошибка MySQL. DMEC Сообщение об ошибке. Index stats cannot allocate memory Ошибка MySQL. DMEC Сообщение об ошибке. Index stats sys tables
NDB_INDEX_STAT_PREFIX partly missing or invalid Ошибка MySQL. DMEC Сообщение об ошибке.
Mysqld: index stats request ignored due to recent error Ошибка MySQL. DMEC Сообщение об ошибке.
Mysqld: index stats request aborted by stats thread Ошибка MySQL. DMEC Сообщение об ошибке.
Index stats were deleted by another process Ошибка MySQL. DMEC Сообщение об ошибке.
Attribute name reused in table definition Ошибка MySQL. DMEC Сообщение об ошибке.
DDL is not supported with mixed data-node versions Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке.
Given NODEGROUP doesn't exist in this cluster Ошибка MySQL. DMEC Сообщение об ошибке.
Index created on temporary table must itself be temporary Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot create a temporary index on a non-temporary table Ошибка MySQL. DMEC Сообщение об ошибке.
A temporary table or index must be specified as not logging Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Logfile group not found Ошибка MySQL. DMEC Сообщение об ошибке. Object definition too big Ошибка MySQL. DMEC Сообщение об ошибке.
Schema feature requires data node upgrade Ошибка MySQL. DMEC Сообщение об ошибке.
A disk table must not be specified as no logging Ошибка MySQL. DMEC Сообщение об ошибке.
Too much attrinfo from application in tuple manager Ошибка MySQL. DMEC Сообщение об ошибке.
Corrupt data received for insert/update Ошибка MySQL. DMEC Сообщение об ошибке.
Too many nullable/bitfields in table definition Ошибка MySQL. DMEC Сообщение об ошибке. Too long or too short default value Ошибка MySQL. DMEC Сообщение об ошибке.
Fixed-size column offset exceeded max. Use VARCHAR or
COLUMN_FORMAT DYNAMIC for memory-stored columns Ошибка MySQL. DMEC Сообщение об ошибке.
Too much attrinfo (e.g. scan filter) for scan in tuple manager Ошибка MySQL. DMEC Сообщение об ошибке. 876 Ошибка MySQL. DMEC Сообщение об ошибке. 877 Ошибка MySQL. DMEC Сообщение об ошибке. 878 Ошибка MySQL. DMEC Сообщение об ошибке. 879 Ошибка MySQL. DMEC Сообщение об ошибке.
Tried to read too much - too many getValue calls Ошибка MySQL. DMEC Сообщение об ошибке. Stack overflow in interpreter Ошибка MySQL. DMEC Сообщение об ошибке. Stack underflow in interpreter Ошибка MySQL. DMEC Сообщение об ошибке.
More than 65535 instructions executed in interpreter Ошибка MySQL. DMEC Сообщение об ошибке. Unsupported type in scan filter Ошибка MySQL. DMEC Сообщение об ошибке.
Update attempt of primary key via ndbcluster internal api
(if this occurs via the MySQL server it is a bug, please report) Ошибка MySQL. DMEC Сообщение об ошибке.
Index stat scan requested with wrong lock mode Ошибка MySQL. DMEC Сообщение об ошибке. Invalid index for index stats update Ошибка MySQL. DMEC Сообщение об ошибке.
Row operation defined after refreshTuple() Ошибка MySQL. DMEC Сообщение об ошибке. Invalid block name Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid error number. Should be >= 0. Ошибка MySQL. DMEC Сообщение об ошибке. Invalid trace number. Ошибка MySQL. DMEC Сообщение об ошибке.
The specified node is not an API node. Ошибка MySQL. DMEC Сообщение об ошибке. Node shutdown in progress Ошибка MySQL. DMEC Сообщение об ошибке. Node shutdown would cause system crash Ошибка MySQL. DMEC Сообщение об ошибке. No contact with database nodes } Ошибка MySQL. DMEC Сообщение об ошибке. No contact with the process (dead ?). Ошибка MySQL. DMEC Сообщение об ошибке.
Operation not allowed while nodes are starting or stopping. Ошибка MySQL. DMEC Сообщение об ошибке.
Batch size for sub scan cannot be smaller than number of fragments. Ошибка MySQL. DMEC Сообщение об ошибке.
Character operand was right truncated Ошибка MySQL. DMEC Сообщение об ошибке.
Character Parameter was right truncated Ошибка MySQL. DMEC Сообщение об ошибке. Query definition too large. Ошибка MySQL. DMEC Сообщение об ошибке.
Query has operation with empty projection. Ошибка MySQL. DMEC Сообщение об ошибке.
Query defintion should have at least one operation. Ошибка MySQL. DMEC Сообщение об ошибке.
Query is in illegal state for this operation. Ошибка MySQL. DMEC Сообщение об ошибке.
A previous query operation failed, which you missed to catch. Ошибка MySQL. DMEC Сообщение об ошибке.
Multiple 'parents' specified in linkedValues for this operation Ошибка MySQL. DMEC Сообщение об ошибке.
Query with multiple scans may not be sorted. Ошибка MySQL. DMEC Сообщение об ошибке. Numeric operand out of range Ошибка MySQL. DMEC Сообщение об ошибке.
Can't use same operand value to specify different column values Ошибка MySQL. DMEC Сообщение об ошибке.
Incompatible datatype specified in operand argument Ошибка MySQL. DMEC Сообщение об ошибке.
Parameter value has an incompatible datatype Ошибка MySQL. DMEC Сообщение об ошибке. Required argument is NULL Ошибка MySQL. DMEC Сообщение об ошибке.
Result row already defined for NdbQueryOperation. Ошибка MySQL. DMEC Сообщение об ошибке.
Index scan order was already set in query definition. Ошибка MySQL. DMEC Сообщение об ошибке.
Parallelism cannot be restricted for sorted scans. Ошибка MySQL. DMEC Сообщение об ошибке.
All required 'key' values was not specified Ошибка MySQL. DMEC Сообщение об ошибке.
Too many 'key' or 'bound' values was specified Ошибка MySQL. DMEC Сообщение об ошибке.
Unknown 'parent' specified in linkedValue Ошибка MySQL. DMEC Сообщение об ошибке.
Specified 'index' does not belong to specified 'table' Ошибка MySQL. DMEC Сообщение об ошибке.
Wrong type of index specified for this operation Ошибка MySQL. DMEC Сообщение об ошибке.
This method cannot be invoked on this type of operation
(lookup/scan/index scan). Ошибка MySQL. DMEC Сообщение об ошибке. Send to process or receive failed. Ошибка MySQL. DMEC Сообщение об ошибке. System shutdown in progress Ошибка MySQL. DMEC Сообщение об ошибке.
Unsupported multi node shutdown. Abort option required. Ошибка MySQL. DMEC Сообщение об ошибке.
The process has wrong type. Expected a DB process. Ошибка MySQL. HA_ERR_KEY_NOT_FOUND Сообщение об ошибке. Tuple did not exist Ошибка MySQL. HA_ERR_NO_REFERENCED_ROW Сообщение об ошибке.
Foreign key constraint violated: No parent row found Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED Сообщение об ошибке.
Foreign key constraint violated: Referenced row exists Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY Сообщение об ошибке.
Tuple already existed when attempting to insert Ошибка MySQL. DMEC Сообщение об ошибке. Illegal null attribute Ошибка MySQL. DMEC Сообщение об ошибке.
Trying to set a NOT NULL attribute to NULL Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY Сообщение об ошибке.
Constraint violation e.g. duplicate value in unique index Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Too many fragments Ошибка MySQL. DMEC Сообщение об ошибке.
Table not defined in local query handler Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. Table is being dropped Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Invalid schema version Ошибка MySQL. DMEC Сообщение об ошибке. Cannot use drop table for drop index Ошибка MySQL. DMEC Сообщение об ошибке. Too long frm data supplied Ошибка MySQL. DMEC Сообщение об ошибке. Invalid table or index to scan Ошибка MySQL. DMEC Сообщение об ошибке. Invalid table or index to scan Ошибка MySQL. DMEC Сообщение об ошибке.
Subscription not found in subscriber manager Ошибка MySQL. DMEC Сообщение об ошибке.
Subscription not unique in subscriber manager Ошибка MySQL. DMEC Сообщение об ошибке.
Table in suscription not defined, probably dropped Ошибка MySQL. DMEC Сообщение об ошибке.
Subscription dropped, no new subscribers allowed Ошибка MySQL. DMEC Сообщение об ошибке. Subscription already dropped Ошибка MySQL. DMEC Сообщение об ошибке.
Partially connected API in NdbOperation::execute() Ошибка MySQL. DMEC Сообщение об ошибке. Out of subscription records Ошибка MySQL. DMEC Сообщение об ошибке. Out of table records in SUMA Ошибка MySQL. DMEC Сообщение об ошибке. Out of MaxNoOfConcurrentSubOperations Ошибка MySQL. DMEC Сообщение об ошибке.
Subscription being defined... while trying to stop subscriber Ошибка MySQL. DMEC Сообщение об ошибке. No such subscriber Ошибка MySQL. DMEC Сообщение об ошибке. Out of filegroup records Ошибка MySQL. DMEC Сообщение об ошибке.
Out of logbuffer memory(specify smaller undo_buffer_size
or increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке. Out of file records Ошибка MySQL. DMEC Сообщение об ошибке.
File system error, check if path, permissions etc Ошибка MySQL. DMEC Сообщение об ошибке. File read error Ошибка MySQL. DMEC Сообщение об ошибке.
Currently there is a limit of one logfile group Ошибка MySQL. DMEC Сообщение об ошибке.
Currently there is a 4G limit of one undo/data-file in 32-bit host Ошибка MySQL. DMEC Сообщение об ошибке. File too small Ошибка MySQL. DMEC Сообщение об ошибке.
Insufficient disk page buffer memory.
Increase DiskPageBufferMemory or reduce data file size. Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. Query table not defined Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. Query table is being dropped Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED Сообщение об ошибке. Query table definition has changed Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - parent table is not table Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid parent table version Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - child table is not table Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid child table version Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid parent index version Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - child index is not index Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid child index version Ошибка MySQL. DMEC Сообщение об ошибке.
Drop foreign key failed in NDB - invalid foreign key version Ошибка MySQL. DMEC Сообщение об ошибке.
Drop foreign key failed in NDB - foreign key not found in TC Ошибка MySQL. DMEC Сообщение об ошибке.
Build foreign key failed in NDB - invalid foreign key version Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED Сообщение об ошибке. Invalid schema object version Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. Table is being dropped Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED Сообщение об ошибке.
Table not defined in transaction coordinator Ошибка MySQL. DMEC Сообщение об ошибке.
Unknown table error in transaction coordinator Ошибка MySQL. DMEC Сообщение об ошибке.
Column defined in event does not exist in table Ошибка MySQL. DMEC Сообщение об ошибке. Invalid table format Ошибка MySQL. DMEC Сообщение об ошибке. Attribute name too long Ошибка MySQL. DMEC Сообщение об ошибке. Table name too long Ошибка MySQL. DMEC Сообщение об ошибке.
No more table metadata records (increase MaxNoOfTables) Ошибка MySQL. DMEC Сообщение об ошибке.
No more attribute metadata records (increase MaxNoOfAttributes) Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. No such table existed Ошибка MySQL. DMEC Сообщение об ошибке.
Internal: Get by table name not supported, use table id. Ошибка MySQL. DMEC Сообщение об ошибке. No more hashmap metadata records Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. No such table existed Ошибка MySQL. DMEC Сообщение об ошибке. Unsupported array size Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Attribute array size too big Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Record too big Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Unsupported primary key length Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Nullable primary key not supported Ошибка MySQL. DMEC Сообщение об ошибке. Unsupported alter table Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке.
Unsupported character set in table or index Ошибка MySQL. DMEC Сообщение об ошибке.
Character string is invalid for given character set Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке.
Distribution key not supported for char attribute
(use binary attribute) Ошибка MySQL. IE Сообщение об ошибке. Invalid file type Ошибка MySQL. DMEC Сообщение об ошибке. Out of file records Ошибка MySQL. DMEC Сообщение об ошибке. Invalid file format Ошибка MySQL. IE Сообщение об ошибке. Invalid filegroup for file Ошибка MySQL. IE Сообщение об ошибке.
Invalid filegroup version when creating file Ошибка MySQL. HA_MISSING_CREATE_OPTION Сообщение об ошибке. Invalid tablespace Ошибка MySQL. DMEC Сообщение об ошибке.
Index on disk column is not supported Ошибка MySQL. DMEC Сообщение об ошибке. Varsize bitfield not supported Ошибка MySQL. DMEC Сообщение об ошибке. Tablespace has changed Ошибка MySQL. DMEC Сообщение об ошибке. Invalid tablespace version Ошибка MySQL. DMEC Сообщение об ошибке. File already exists Ошибка MySQL. DMEC Сообщение об ошибке.
Unable to drop table as backup is in progress Ошибка MySQL. DMEC Сообщение об ошибке.
Unable to alter table as backup is in progress Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Invalid extent size Ошибка MySQL. DMEC Сообщение об ошибке. Out of filegroup records Ошибка MySQL. DMEC Сообщение об ошибке. Cant drop file, no such file Ошибка MySQL. DMEC Сообщение об ошибке.
Cant drop filegroup, no such filegroup Ошибка MySQL. DMEC Сообщение об ошибке. Cant drop filegroup, filegroup is used Ошибка MySQL. DMEC Сообщение об ошибке.
Drop undofile not supported, drop logfile group instead Ошибка MySQL. DMEC Сообщение об ошибке. Cant drop file, file is used Ошибка MySQL. DMEC Сообщение об ошибке.
Out of string memory, please modify StringMemory config parameter Ошибка MySQL. DMEC Сообщение об ошибке. Invalid schema object for drop Ошибка MySQL. DMEC Сообщение об ошибке.
Create file is not supported when Diskless=1 Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Invalid undo buffer size Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Invalid hashmap Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Too many total bits in bitfields Ошибка MySQL. DMEC Сообщение об ошибке.
Default value for primary key column not supported Ошибка MySQL. DMEC Сообщение об ошибке. Out of schema transaction memory Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке.
Non default partitioning without partitions Ошибка MySQL. DMEC Сообщение об ошибке.
Unable to create table, out of data pages (increase DataMemory) Ошибка MySQL. DMEC Сообщение об ошибке. Unsupported attribute type in index Ошибка MySQL. DMEC Сообщение об ошибке.
Unsupported character set in table or index Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Сообщение об ошибке. Index is being dropped Ошибка MySQL. DMEC Сообщение об ошибке.
Index stat scan requested on index with unsupported key size Ошибка MySQL. HA_ERR_TABLE_EXIST Сообщение об ошибке.
Index or table with given name already exists Ошибка MySQL. HA_ERR_TABLE_EXIST Сообщение об ошибке.
Schema object with given name already exists Ошибка MySQL. DMEC Сообщение об ошибке. Event name already exists Ошибка MySQL. DMEC Сообщение об ошибке. Backup aborted by user request Ошибка MySQL. DMEC Сообщение об ошибке.
NdbScanFilter: Operator is not defined in NdbScanFilter::Group Ошибка MySQL. DMEC Сообщение об ошибке. NdbScanFilter: Column is NULL Ошибка MySQL. DMEC Сообщение об ошибке.
NdbScanFilter: Condition is out of bounds Ошибка MySQL. DMEC Сообщение об ошибке. Out of resources Ошибка MySQL. DMEC Сообщение об ошибке.
Can't accept more subscribers, out of space in pool Ошибка MySQL. DMEC Сообщение об ошибке.
Can't accept more subscriptions, out of space in pool Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке. Out of extents, tablespace full Ошибка MySQL. DMEC Сообщение об ошибке. No datafile in tablespace Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Table fragment fixed data reference has reached maximum
possible value (specify MAXROWS or increase no of partitions) Ошибка MySQL. DMEC Сообщение об ошибке. Error -1 from get_page Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Out of page request records when allocating disk record Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Out of extent records when allocating disk record Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке. 623 Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке. 624 Ошибка MySQL. HA_ERR_INDEX_FILE_FULL Сообщение об ошибке.
Out of memory in Ndb Kernel, hash index part (increase DataMemory) Ошибка MySQL. HA_ERR_INDEX_FILE_FULL Сообщение об ошибке.
Table fragment hash index has reached maximum possible size Ошибка MySQL. DMEC Сообщение об ошибке.
Too many hash indexes (should not happen) Ошибка MySQL. DMEC Сообщение об ошибке. Out of event records Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Too many tables and attributes (increase MaxNoOfAttributes
or MaxNoOfTables) Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Out of memory in Ndb Kernel, table data (increase DataMemory) Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке.
Table fragment fixed data reference has reached maximum
possible value (specify MAXROWS or increase no of partitions) Ошибка MySQL. HA_ERR_RECORD_FILE_FULL Сообщение об ошибке. Out of memory in Ndb Kernel,
ordered index data (increase DataMemory) Ошибка MySQL. HA_ERR_INDEX_FILE_FULL Сообщение об ошибке.
Too many ordered indexes (increase MaxNoOfOrderedIndexes) Ошибка MySQL. HA_ERR_INDEX_FILE_FULL Сообщение об ошибке.
Out of fragment records (increase MaxNoOfOrderedIndexes) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of attribute records (increase MaxNoOfAttributes) Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid ordered index tree node size Ошибка MySQL. DMEC Сообщение об ошибке. Out of operation records in local
data manager (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке. Send Buffers overloaded in NDB kernel Ошибка MySQL. DMEC Сообщение об ошибке.
REDO log files overloaded (increase FragmentLogFileSize) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction markers in LQH, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке.
REDO log files overloaded (increase disk hardware) Ошибка MySQL. DMEC Сообщение об ошибке. Backup failed: file already exists
(use 'START BACKUP <backup id>') Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber manager busy with adding/removing a subscriber Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber manager busy with adding the subscription Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber manager has subscribers on this subscription Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber manager busy with adding/removing a table Ошибка MySQL. DMEC Сообщение об ошибке. Out of undo space Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due out of operation records Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to out of LongMessageBuffer Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to out of query memory Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to out of row memory Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - no more object records Ошибка MySQL. DMEC Сообщение об ошибке. 217 Ошибка MySQL. DMEC Сообщение об ошибке. Out of LongMessageBuffer Ошибка MySQL. DMEC Сообщение об ошибке. 219 Ошибка MySQL. DMEC Сообщение об ошибке.
Too many concurrently fired triggers, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке.
Out of operation records in transaction coordinator
(increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Too many active scans, increase MaxNoOfConcurrentScans Ошибка MySQL. DMEC Сообщение об ошибке.
Out of frag location records in TC (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке. Out of transaction markers databuffer in
TC, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке. Out of transaction records for complete phase
(increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction markers in TC, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке. No space left on the device Ошибка MySQL. DMEC Сообщение об ошибке.
Error with file permissions, please check file system Ошибка MySQL. DMEC Сообщение об ошибке.
Error in reading files, please check file system Ошибка MySQL. DMEC Сообщение об ошибке.
Out of index operations in transaction coordinator
(increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction buffer memory in TC (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of scanfrag records in TC (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of attribute buffers in TC block, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке. Out of LongMessageBuffer Ошибка MySQL. DMEC Сообщение об ошибке. Out of Send Buffer space in NDB API Ошибка MySQL. DMEC Сообщение об ошибке. Out of Send Buffer space in NDB API Ошибка MySQL. DMEC Сообщение об ошибке. Out of Send Buffer space in NDB API Ошибка MySQL. DMEC Сообщение об ошибке. 414 Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction buffers in LQH, increase LongSignalMemory Ошибка MySQL. DMEC Сообщение об ошибке.
Out of signal memory, increase LongSignalMemory Ошибка MySQL. DMEC Сообщение об ошибке. Too many active scans Ошибка MySQL. DMEC Сообщение об ошибке.
Out of scan records in LQH, increase SharedGlobalMemory Ошибка MySQL. DMEC Сообщение об ошибке. Too many active scans Ошибка MySQL. DMEC Сообщение об ошибке. Busy during read of event table Ошибка MySQL. DMEC Сообщение об ошибке. Too many schema transactions Ошибка MySQL. DMEC Сообщение об ошибке. Too many schema operations Ошибка MySQL. DMEC Сообщение об ошибке. Invalid schema transaction state Ошибка MySQL. DMEC Сообщение об ошибке.
Schema object is busy with another schema transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Missing schema operation at takeover of schema transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Out of attrinfo records in tuple manager, increase LongSignalMemory Ошибка MySQL. DMEC Сообщение об ошибке. Out of add fragment operation records Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, ordered
index data (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке. Rowid already allocated Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, ordered
scan operation (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке. No free index stats op Ошибка MySQL. DMEC Сообщение об ошибке. Cannot prepare index stats update Ошибка MySQL. DMEC Сообщение об ошибке. Cannot execute index stats update Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, copy
tuples (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of UNDO buffer memory (increase UNDO_BUFFER_SIZE) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, stored
procedure record (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, tup scan
operation (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Out of transaction memory in local data manager, acc scan
operation (increase SharedGlobalMemory) Ошибка MySQL. DMEC Сообщение об ошибке.
Temporary failure, distribution changed Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber manager busy with node recovery Ошибка MySQL. DMEC Сообщение об ошибке.
Api node died, when SUB_START_REQ reached node Ошибка MySQL. DMEC Сообщение об ошибке. Query aborted due to node failure Ошибка MySQL. DMEC Сообщение об ошибке.
Node where lock was held crashed, restart scan transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке. Send to NDB failed Ошибка MySQL. DMEC Сообщение об ошибке. Send to ndbd node failed Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Request timed out in waiting for node failure Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Node failure caused abort of transaction Ошибка MySQL. DMEC Сообщение об ошибке. Send to NDB failed Ошибка MySQL. DMEC Сообщение об ошибке. Cluster temporary unavailable Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction was committed but all read information was not
received due to node crash Ошибка MySQL. DMEC Сообщение об ошибке.
Simple/dirty read failed due to node failure Ошибка MySQL. DMEC Сообщение об ошибке.
Scan take over error, restart scan transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Scan take over error, restart scan transaction Ошибка MySQL. DMEC Сообщение об ошибке.
Schema transaction aborted due to node-failure Ошибка MySQL. DMEC Сообщение об ошибке.
REDO buffers overloaded (increase RedoBuffer) Ошибка MySQL. DMEC Сообщение об ошибке. IO overload error Ошибка MySQL. DMEC Сообщение об ошибке.
Connect failure - out of connection objects (increase
MaxNoOfConcurrentTransactions) Ошибка MySQL. DMEC Сообщение об ошибке.
REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase
NoOfFragmentLogFiles) Ошибка MySQL. DMEC Сообщение об ошибке.
Index UNDO buffers overloaded (increase UndoIndexBuffer) Ошибка MySQL. DMEC Сообщение об ошибке.
System busy with other schema operation Ошибка MySQL. DMEC Сообщение об ошибке.
System busy with node restart, schema operations not allowed Ошибка MySQL. DMEC Сообщение об ошибке.
Data UNDO buffers overloaded (increase UndoDataBuffer) Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT Сообщение об ошибке.
Transaction had timed out when trying to commit it Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT Сообщение об ошибке.
Time-out in NDB, probably caused by deadlock Ошибка MySQL. DMEC Сообщение об ошибке. Timeout/deadlock during index build Ошибка MySQL. DMEC Сообщение об ошибке.
Time-out due to node shutdown not starting in time Ошибка MySQL. DMEC Сообщение об ошибке.
Time-out due to node shutdown not completing in time Ошибка MySQL. DMEC Сообщение об ошибке.
Read operation aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке.
Transaction aborted due to node shutdown Ошибка MySQL. DMEC Сообщение об ошибке. Node failure handling not completed Ошибка MySQL. DMEC Сообщение об ошибке.
Not ready for connection allocation yet Ошибка MySQL. DMEC Сообщение об ошибке. Request to non-master Ошибка MySQL. DMEC Сообщение об ошибке. Schema transaction aborted Ошибка MySQL. DMEC Сообщение об ошибке. Receive from NDB failed Ошибка MySQL. HA_ERR_NO_CONNECTION Сообщение об ошибке. Cluster Failure Ошибка MySQL. DMEC Сообщение об ошибке. Request ndbd time-out, maybe due to high
load or communication problems Ошибка MySQL. DMEC Сообщение об ошибке. Undefined error Ошибка MySQL. DMEC Сообщение об ошибке.
Backup issued to not master (reissue command to master) Ошибка MySQL. DMEC Сообщение об ошибке. Sequence failure Ошибка MySQL. DMEC Сообщение об ошибке. Backup definition not implemented Ошибка MySQL. DMEC Сообщение об ошибке. Backup already completed Ошибка MySQL. DMEC Сообщение об ошибке. 1323 Ошибка MySQL. DMEC Сообщение об ошибке. Backup log buffer full Ошибка MySQL. DMEC Сообщение об ошибке. File or scan error Ошибка MySQL. DMEC Сообщение об ошибке. Backup aborted due to node failure Ошибка MySQL. DMEC Сообщение об ошибке. 1327 Ошибка MySQL. DMEC Сообщение об ошибке. Backup undefined error Ошибка MySQL. DMEC Сообщение об ошибке.
No replica to scan on this node (internal index stats error) Ошибка MySQL. DMEC Сообщение об ошибке.
Subscriber node undefined in SubStartReq (config change?) Ошибка MySQL. DMEC Сообщение об ошибке. Filegroup already exists Ошибка MySQL. DMEC Сообщение об ошибке. Invalid filegroup Ошибка MySQL. DMEC Сообщение об ошибке. Invalid filegroup version Ошибка MySQL. DMEC Сообщение об ошибке. File no already inuse Ошибка MySQL. DMEC Сообщение об ошибке. File meta data error Ошибка MySQL. DMEC Сообщение об ошибке. Out of memory Ошибка MySQL. DMEC Сообщение об ошибке. Filegroup not online Ошибка MySQL. DMEC Сообщение об ошибке. Undefined error Ошибка MySQL. DMEC Сообщение об ошибке. Query aborted due to empty query tree Ошибка MySQL. DMEC Сообщение об ошибке. Query aborted due to invalid request Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to unknown query operation Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to invalid tree node specification Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to invalid tree parameter specification Ошибка MySQL. DMEC Сообщение об ошибке. Query aborted due to invalid pattern Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to query node too big Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to query node parameters too big Ошибка MySQL. DMEC Сообщение об ошибке. Query aborted due to both tree and parameters
contain interpreted program Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to invalid tree parameter specification:
Key parameter bits mismatch Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to invalid tree parameter specification:
Incorrect key parameter count Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to internal error Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to invalid node count Ошибка MySQL. DMEC Сообщение об ошибке.
Query aborted due to index fragment not found Ошибка MySQL. DMEC Сообщение об ошибке. 202 Ошибка MySQL. DMEC Сообщение об ошибке. 203 Ошибка MySQL. DMEC Сообщение об ошибке. 207 Ошибка MySQL. DMEC Сообщение об ошибке. 208 Ошибка MySQL. DMEC Сообщение об ошибке. Communication problem, signal error Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid request Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - object already exists in TC Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - no more object records in TC Ошибка MySQL. DMEC Сообщение об ошибке.
Create foreign key failed in NDB - invalid request to TC Ошибка MySQL. DMEC Сообщение об ошибке. 220 Ошибка MySQL. DMEC Сообщение об ошибке. 230 Ошибка MySQL. DMEC Сообщение об ошибке. 232 Ошибка MySQL. DMEC Сообщение об ошибке. 238 Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid data encountered during foreign key trigger execution Ошибка MySQL. DMEC Сообщение об ошибке.
Simple Read transaction without any attributes to read Ошибка MySQL. DMEC Сообщение об ошибке.
Update operation without any attributes to update Ошибка MySQL. DMEC Сообщение об ошибке. 276 Ошибка MySQL. DMEC Сообщение об ошибке. 277 Ошибка MySQL. DMEC Сообщение об ошибке. 278 Ошибка MySQL. DMEC Сообщение об ошибке. Index corrupted Ошибка MySQL. DMEC Сообщение об ошибке. Corrupt key in TC, unable to xfrm Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistent index state in TC block Ошибка MySQL. DMEC Сообщение об ошибке.
Unlocked operation has out of range index Ошибка MySQL. DMEC Сообщение об ошибке. Unlocked operation has invalid state Ошибка MySQL. DMEC Сообщение об ошибке. Invalid distribution key Ошибка MySQL. DMEC Сообщение об ошибке. Out of fragment records in DIH Ошибка MySQL. DMEC Сообщение об ошибке. MEMORY ALLOCATION ERROR Ошибка MySQL. DMEC Сообщение об ошибке. Signal Definition Error Ошибка MySQL. DMEC Сообщение об ошибке. Internal Error in NdbApi Ошибка MySQL. DMEC Сообщение об ошибке. Internal Error in NdbApi Ошибка MySQL. DMEC Сообщение об ошибке. Simple Transaction and Not Start Ошибка MySQL. DMEC Сообщение об ошибке. Faulty operation type Ошибка MySQL. DMEC Сообщение об ошибке. Faulty primary key attribute length Ошибка MySQL. DMEC Сообщение об ошибке. Faulty length in ATTRINFO signal Ошибка MySQL. DMEC Сообщение об ошибке. Status Error in NdbConnection Ошибка MySQL. DMEC Сообщение об ошибке. Too many operations received Ошибка MySQL. DMEC Сообщение об ошибке. Bad state handling unlock request Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid blob attributes or invalid blob parts table Ошибка MySQL. DMEC Сообщение об ошибке. Corrupted blob value Ошибка MySQL. DMEC Сообщение об ошибке.
Error in blob head update forced rollback of transaction Ошибка MySQL. DMEC Сообщение об ошибке.
No connection to ndb management server Ошибка MySQL. DMEC Сообщение об ошибке. Unknown blob error Ошибка MySQL. DMEC Сообщение об ошибке. No blob table in dict cache Ошибка MySQL. DMEC Сообщение об ошибке.
Corrupted main table PK in blob operation Ошибка MySQL. DMEC Сообщение об ошибке.
Cannot use the same object twice to create table Ошибка MySQL. DMEC Сообщение об ошибке.
Trying to start two schema transactions Ошибка MySQL. DMEC Сообщение об ошибке.
Only DBDICT and TRIX can send requests to TRIX Ошибка MySQL. DMEC Сообщение об ошибке.
TRIX block is not available yet, probably due to node failure Ошибка MySQL. DMEC Сообщение об ошибке. Internal error at index create/build Ошибка MySQL. DMEC Сообщение об ошибке. Bad state at alter index Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistency detected at alter index Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistency detected at index usage Ошибка MySQL. DMEC Сообщение об ошибке. Transaction already aborted Ошибка MySQL. DMEC Сообщение об ошибке.
Index stats samples data or memory cache is invalid Ошибка MySQL. DMEC Сообщение об ошибке. Index stats internal error Ошибка MySQL. DMEC Сообщение об ошибке.
Mysqld: index stats thread not open for requests Ошибка MySQL. DMEC Сообщение об ошибке.
Mysqld: index stats entry unexpectedly not found Ошибка MySQL. DMEC Сообщение об ошибке. Event not found Ошибка MySQL. DMEC Сообщение об ошибке. 632 Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistency during table creation Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Primary Table in wrong state Ошибка MySQL. HA_WRONG_CREATE_OPTION Сообщение об ошибке. Given fragmentType doesn't exist Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid schema transaction key from NDB API Ошибка MySQL. DMEC Сообщение об ошибке.
Invalid schema transaction id from NDB API Ошибка MySQL. DMEC Сообщение об ошибке. Out of LongMessageBuffer in DICT Ошибка MySQL. DMEC Сообщение об ошибке. 809 Ошибка MySQL. DMEC Сообщение об ошибке. 812 Ошибка MySQL. DMEC Сообщение об ошибке. 833 Ошибка MySQL. DMEC Сообщение об ошибке. 871 Ошибка MySQL. DMEC Сообщение об ошибке. 882 Ошибка MySQL. DMEC Сообщение об ошибке. 883 Ошибка MySQL. DMEC Сообщение об ошибке. 887 Ошибка MySQL. DMEC Сообщение об ошибке. 888 Ошибка MySQL. DMEC Сообщение об ошибке. 890 Ошибка MySQL. DMEC Сообщение об ошибке.
Tuple corrupted - wrong checksum or column data in invalid format Ошибка MySQL. DMEC Сообщение об ошибке. Inconsistent ordered index.
The index needs to be dropped and recreated Ошибка MySQL. DMEC Сообщение об ошибке. Invalid index stats request Ошибка MySQL. DMEC Сообщение об ошибке. Invalid index stats sys tables Ошибка MySQL. DMEC Сообщение об ошибке. Invalid index stats sys tables data
Ошибка MySQL. DMEC Сообщение об ошибке. Function not implemented yet Ошибка MySQL. DMEC Сообщение об ошибке.
Wrong fragment count for fully replicated table Эта секция перечисляет все ошибки Ошибка MySQL. 0 Тип ошибки NDB. No error Сообщение об ошибке. No error Ошибка MySQL. DMEC Тип ошибки NDB. Node Recovery error Сообщение об ошибке.
Temporary failure, distribution changed Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Out of operation records in local data manager
(increase SharedGlobalMemory) Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Send Buffers overloaded in NDB kernel Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
REDO log files overloaded (increase FragmentLogFileSize)
Ошибка MySQL. DMEC Тип ошибки NDB. Overload error Сообщение об ошибке.
REDO buffers overloaded (increase RedoBuffer) Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Out of transaction markers in LQH, increase
SharedGlobalMemory Ошибка MySQL. DMEC Тип ошибки NDB. Node shutdown Сообщение об ошибке.
Read operation aborted due to node shutdown Ошибка MySQL. HA_WRONG_CREATE_OPTION Тип ошибки NDB. Schema error Сообщение об ошибке. Too many fragments Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Table not defined in local query handler Ошибка MySQL. HA_ERR_NO_SUCH_TABLE Тип ошибки NDB. Schema error Сообщение об ошибке. Table is being dropped Ошибка MySQL. HA_WRONG_CREATE_OPTION Тип ошибки NDB. Schema error Сообщение об ошибке. Invalid schema version Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Cannot use drop table for drop index Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке. Too long frm data supplied
Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Invalid table or index to scan Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Invalid table or index to scan Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке. Table read-only Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
REDO log files overloaded (increase disk hardware) Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. Undefined error Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке.
Backup issued to not master (reissue command to master) Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
A backup is already running Ошибка MySQL. DMEC Тип ошибки NDB. Insufficient space Сообщение об ошибке. Out of resources Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. Sequence failure Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке.
Backup definition not implemented Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup not supported in diskless mode (change Diskless) Ошибка MySQL. DMEC Тип ошибки NDB. User defined error Сообщение об ошибке. Backup aborted by user request
Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке.
Backup already completed Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. 1323 Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. Backup log buffer full Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. File or scan error Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке.
Backup aborted due to node failure Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. 1327 Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup during software upgrade not supported Ошибка MySQL. DMEC Тип ошибки NDB. Internal error Сообщение об ошибке. Backup undefined error Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to allocate buffers (check configuration) Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to setup fs buffers (check configuration) Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to allocate tables (check configuration) Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to insert file header (check configuration)
Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to insert table list (check configuration)
Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to allocate table memory (check configuration)
Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to allocate file record (check configuration)
Ошибка MySQL. DMEC Тип ошибки NDB. Application error Сообщение об ошибке.
Backup failed to allocate attribute record (check configuration)
Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Backup failed: file already exists (use 'START
BACKUP <backup id>') Ошибка MySQL. DMEC Тип ошибки NDB. Node Recovery error Сообщение об ошибке.
Subscriber manager busy with node recovery Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Subscription not found in subscriber manager Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Subscriber manager busy with adding/removing a subscriber
Ошибка MySQL. DMEC Тип ошибки NDB. Insufficient space Сообщение об ошибке.
Can't accept more subscribers, out of space in pool Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Subscriber manager busy with adding the subscription Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Subscriber manager has subscribers on this subscription Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Subscription not unique in subscriber manager Ошибка MySQL. DMEC Тип ошибки NDB. Insufficient space Сообщение об ошибке.
Can't accept more subscriptions, out of space in pool Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Table in suscription not defined, probably dropped Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Subscription dropped, no new subscribers allowed Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Subscription already dropped Ошибка MySQL. DMEC Тип ошибки NDB. Temporary Resource error Сообщение об ошибке.
Subscriber manager busy with adding/removing a table Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Partially connected API in NdbOperation::execute() Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке. Out of subscription records
Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Out of table records in SUMA Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Out of MaxNoOfConcurrentSubOperations Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке.
Subscription being defined... while trying to stop subscriber
Ошибка MySQL. DMEC Тип ошибки NDB. Schema error Сообщение об ошибке. No such subscriber Ошибка MySQL. DMEC Тип ошибки NDB. Node Recovery error Сообщение об ошибке.
Api node died, when SUB_START_REQ reached node Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
No replica to scan on this node (internal index
stats error)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Subscriber node undefined in SubStartReq (config
change?)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of undo space
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Filegroup already exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of filegroup records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of logbuffer memory(specify smaller
undo_buffer_size or increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid filegroup
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid filegroup version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
File no already inuse
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of file records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
File system error, check if path,permissions
etc
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
File meta data error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Out of memory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
File read error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Filegroup not online
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Currently there is a limit of one logfile
group
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Currently there is a 4G limit of one
undo/data-file in 32-bit host
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
File too small
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Insufficient disk page buffer memory. Increase
DiskPageBufferMemory or reduce data file size.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
IO overload error
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of extents, tablespace full
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
No datafile in tablespace
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Table fragment fixed data reference has reached
maximum possible value (specify MAXROWS or increase no of
partitions)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Error -1 from get_page
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of page request records when allocating disk
record
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of extent records when allocating disk
record
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Undefined error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Node already reserved
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Node already connected
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal temporary
Сообщение об ошибке.
Node failure handling not completed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Node type mismatch
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal temporary
Сообщение об ошибке.
Not ready for connection allocation
yet
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Query aborted due out of operation
records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to empty query tree
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid request
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to unknown query
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid tree node
specification
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid tree parameter
specification
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Query aborted due to out of
LongMessageBuffer
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid pattern
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Query aborted due to out of query
memory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to query node too
big
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to query node parameters too
big
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to both tree and parameters
contain interpreted program
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid tree parameter
specification: Key parameter bits mismatch
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid tree parameter
specification: Incorrect key parameter count
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to internal error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Query aborted due to out of row
memory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Query aborted due to node failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to invalid node
count
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Query aborted due to index fragment not
found
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Query table not defined
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Query table is being dropped
Ошибка MySQL.
HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Query table definition has changed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
202
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
203
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
207
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
208
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Communication problem, signal error
Ошибка MySQL.
HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Create foreign key failed - parent key is primary
key and on-update-cascade is not allowed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Create foreign key failed in NDB - no more object
records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid
request
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - parent table
is not table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid parent
table version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - child table is
not table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid child
table version
Ошибка MySQL.
HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Create foreign key failed in NDB - parent index
is not unique index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid parent
index version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - child index is
not index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid child
index version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Create foreign key failed in NDB - object already
exists in TC
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Create foreign key failed in NDB - no more object
records in TC
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Create foreign key failed in NDB - invalid
request to TC
Ошибка MySQL.
HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Create foreign key failed in NDB - No parent row
found
Ошибка MySQL.
HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Create foreign key failed - child table has Blob
or Text column and on-delete-cascade is not
allowed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Drop foreign key failed in NDB - foreign key not
found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Drop foreign key failed in NDB - invalid foreign
key version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Drop foreign key failed in NDB - foreign key not
found in TC
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Build foreign key failed in NDB - foreign key not
found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Build foreign key failed in NDB - invalid foreign
key version
Ошибка MySQL.
HA_ERR_ROW_IS_REFERENCED
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Drop table not allowed in NDB - referenced by
foreign key on another table
Ошибка MySQL.
HA_ERR_DROP_INDEX_FK
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Drop index not allowed in NDB - used as parent
index of a foreign key
Ошибка MySQL.
HA_ERR_DROP_INDEX_FK
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Drop index not allowed in NDB - used as child
index of a foreign key
Ошибка MySQL.
HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Create foreign key failed in NDB - name contains
invalid character (/)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
217
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of LongMessageBuffer
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
219
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
220
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many concurrently fired triggers, increase
SharedGlobalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
230
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
232
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of operation records in transaction
coordinator (increase SharedGlobalMemory)
Ошибка MySQL.
HA_ERR_LOCK_WAIT_TIMEOUT
Тип ошибки NDB.
Timeout expired
Сообщение об ошибке.
Transaction had timed out when trying to commit
it
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
238
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid data encountered during foreign key
trigger execution
Ошибка MySQL.
HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid schema object version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Zero concurrency in scan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too high concurrency in scan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many active scans, increase
MaxNoOfConcurrentScans
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node where lock was held crashed, restart scan
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of frag location records in TC (increase
SharedGlobalMemory)
Ошибка MySQL.
HA_ERR_NO_REFERENCED_ROW
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Foreign key constraint violated: No parent row
found
Ошибка MySQL.
HA_ERR_ROW_IS_REFERENCED
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Foreign key constraint violated: Referenced row
exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
DML count in transaction exceeds config parameter
MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations
Ошибка MySQL.
HA_ERR_LOCK_WAIT_TIMEOUT
Тип ошибки NDB.
Timeout expired
Сообщение об ошибке.
Time-out in NDB, probably caused by
deadlock
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No condition and attributes to read in
scan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node shutdown
Сообщение об ошибке.
Transaction aborted due to node
shutdown
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Simple Read transaction without any attributes to
read
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Update operation without any attributes to
update
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction markers databuffer in TC,
increase SharedGlobalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction records for complete phase
(increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
276
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
277
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
278
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction markers in TC, increase
SharedGlobalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node shutdown
Сообщение об ошибке.
Transaction aborted due to node
shutdown
Ошибка MySQL.
HA_ERR_NO_CONNECTION
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Operation not allowed due to cluster shutdown in
progress
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
No space left on the device
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Error with file permissions, please check file
system
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Error in reading files, please check file
system
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Table is being dropped
Ошибка MySQL.
HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Table not defined in transaction
coordinator
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unknown table error in transaction
coordinator
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Index corrupted
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of index operations in transaction
coordinator (increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction buffer memory in TC (increase
SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Corrupt key in TC, unable to xfrm
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of scanfrag records in TC (increase
SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Inconsistent index state in TC block
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of attribute buffers in TC block, increase
SharedGlobalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Unlocked operation has out of range
index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Unlocked operation has invalid state
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid distribution key
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Operation not allowed or aborted due to single
user mode
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Out of fragment records in DIH
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Undefined partition used in
setPartitionId
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of LongMessageBuffer
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid no of nodes specified for new
nodegroup
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid nodegroup id
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, node
already in nodegroup
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid nodegroup id, nodegroup already
existing
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, no
node in nodegroup is started
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid node(s) specified for new nodegroup, node
ID invalid or undefined
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
MEMORY ALLOCATION ERROR
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Signal Definition Error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Send to NDB failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Function not implemented
Сообщение об ошибке.
Function not implemented yet
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attribute name or id not found in the
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Internal Error in NdbApi
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
Connect failure - out of connection objects
(increase MaxNoOfConcurrentTransactions)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Send to ndbd node failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Unknown result error
Сообщение об ошибке.
Receive from NDB failed
Ошибка MySQL.
HA_ERR_NO_CONNECTION
Тип ошибки NDB.
Unknown result error
Сообщение об ошибке.
Cluster Failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Internal Error in NdbApi
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Unknown result error
Сообщение об ошибке.
Request ndbd time-out, maybe due to high load or
communication problems
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Request timed out in waiting for node
failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of Send Buffer space in NDB API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of Send Buffer space in NDB API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node shutdown
Сообщение об ошибке.
Transaction aborted due to node
shutdown
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node shutdown
Сообщение об ошибке.
Transaction aborted due to node
shutdown
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Node failure caused abort of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of Send Buffer space in NDB API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Send to NDB failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node shutdown
Сообщение об ошибке.
Transaction aborted due to node
shutdown
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Cluster temporary unavailable
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
REDO log files overloaded (decrease
TimeBetweenLocalCheckpoints or increase
NoOfFragmentLogFiles)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Status Error in NDB
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No connections to NDB available and connect
failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Type in NdbTamper not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No schema connections to NDB available and
connect failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Ndb Init in wrong state, destroy Ndb object and
create a new
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many Ndb objects
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
All Not NULL attribute have not been
defined
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Simple Transaction and Not Start
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Faulty operation type
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Faulty primary key attribute length
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Faulty length in ATTRINFO signal
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Status Error in NdbConnection
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Too many operations received
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Transaction is already completed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Transaction was committed but all read
information was not received due to node crash
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Operation was not defined correctly, probably
missing a key
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Could not start transporter, configuration
error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Parameter error in API call
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Simple/dirty read failed due to node
failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Scan already complete
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot set name twice for an Ndb
object
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot set name after Ndb object is
initialised
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Free percent out of range. Allowed range is
1-99
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
414
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Bad state handling unlock request
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Bad operation reference - double
unlock
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction buffers in LQH, increase
LongSignalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of signal memory, increase
LongSignalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Status Error when defining an
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Variable Arrays not yet supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Set value on tuple key attribute is not
allowed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trying to set a NOT NULL attribute to
NULL
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Set value and Read/Delete Tuple is
incompatible
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No Key attribute used to define tuple
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not allowed to equal key attribute
twice
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Key size is limited to 4092 bytes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trying to read a non-stored attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Length parameter in equal/setValue is
incorrect
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Ndb sent more info than the length he
specified
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Inconsistency in list of
NdbRecAttr-objects
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Ndb reports NULL value on Not NULL
attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not all data of an attribute has been
received
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not all attributes have been received
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
More data received than reported in TCKEYCONF
message
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
More than 8052 bytes in setValue cannot be
handled
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
It is not allowed to increment any other than
unsigned ints
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Currently not allowed to increment NULL-able
attributes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Maximum size of interpretative attributes are 64
bits
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Maximum size of interpretative attributes are 64
bits
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trying to jump to a non-defined label
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Label was not found, internal error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not allowed to create jumps to
yourself
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not allowed to jump to a label in a different
subroutine
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
All primary keys defined, call
setValue/getValue
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Bad number when defining a label
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Bad number when defining a subroutine
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal interpreter function in scan
definition
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal register in interpreter function
definition
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal state when calling getValue, probably not
a read
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal state when calling interpreter
routine
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Parallelism can only be between 1 and
240
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Calling execute (synchronous) when already
prepared asynchronous transaction exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal to call setValue in this
state
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No callback from execute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trigger name too long
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many triggers
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trigger not found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trigger with given name already
exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Unsupported trigger type
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index name too long
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many indexes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index not found
Ошибка MySQL.
HA_ERR_TABLE_EXIST
Тип ошибки NDB.
Schema object already exists
Сообщение об ошибке.
Index or table with given name already
exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal index/trigger create/drop/alter
request
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Trigger/index name invalid
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid index type or index logging
option
Ошибка MySQL.
HA_ERR_FOUND_DUPP_UNIQUE
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot create unique index, duplicate keys
found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Failed to allocate space for index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Failed to create index table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Table not an index table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Hash index attributes must be specified in same
order as table attributes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Must call Ndb::init() before this
function
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Tried to read too much - too many getValue
calls
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot create unique index, duplicate attributes
found in definition
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid set of range scan bounds
Ошибка MySQL.
DMEC
Тип ошибки NDB.
User defined error
Сообщение об ошибке.
NdbScanFilter: Operator is not defined in
NdbScanFilter::Group
Ошибка MySQL.
DMEC
Тип ошибки NDB.
User defined error
Сообщение об ошибке.
NdbScanFilter: Column is NULL
Ошибка MySQL.
DMEC
Тип ошибки NDB.
User defined error
Сообщение об ошибке.
NdbScanFilter: Condition is out of
bounds
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid blob attributes or invalid blob parts
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid usage of blob attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
The method is not valid in current blob
state
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid blob seek position
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Corrupted blob value
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Error in blob head update forced rollback of
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
No connection to ndb management
server
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Unknown blob error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid index object, not retrieved via
getIndex()
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Table definition has undefined column
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
No blob table in dict cache
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Corrupted main table PK in blob
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
The blob method is incompatible with operation
type or lock mode
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Missing NULL ptr in end of keyData
list
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Key part len is to small for column
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Supplied buffer to small
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Malformed string
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Inconsistent key part length
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many keys specified for key bound in
scanIndex
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
range_no not strictly increasing in ordered
multi-range index scan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
key_record in index scan is not an index
ndbrecord
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot mix NdbRecAttr and NdbRecord methods in
one operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NULL NdbRecord pointer
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid range_no (must be < 4096)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
The key_record and attribute_record in primary
key operation do not belong to the same table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Blob handle for column not available
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
API version mismatch or wrong
sizeof(NdbDictionary::RecordSpecification)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Missing column specification in
NdbDictionary::RecordSpecification
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Duplicate column specification in
NdbDictionary::RecordSpecification
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbRecord for tuple access is not an index key
NdbRecord
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Error returned from application scanIndex()
callback
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Scan filter is too large, discarded
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Column is NULL in Get/SetValueSpec
structure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid AbortOption
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid or unsupported OperationOptions
structure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid or unsupported ScanOptions
structure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Incorrect combination of ScanOption flags,
extraGetValues ptr and numExtraGetValues
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Tuple Key Type not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Fragment Type not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Minimum Load Factor not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Maximum Load Factor not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Maximum Load Factor smaller than
Minimum
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
K value must currently be set to 6
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Memory Type not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid table name
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attribute Size not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Fixed array too large, maximum 64000
bytes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attribute Type not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Storage Mode not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Null Attribute Type not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index only storage for non-key
attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Storage Type of attribute not correct
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No more key attributes allowed after defining
variable length key attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Key attributes are not allowed to be NULL
attributes
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many primary keys defined in
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid attribute name or number
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
createAttribute called at erroneus
place
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Cannot use the same object twice to create
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Trying to start two schema
transactions
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attempt to define distribution key when not
prepared to
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Distribution Key set on table but not defined on
first attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attempt to define distribution group when not
prepared to
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Distribution Group set on table but not defined
on first attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Distribution Group with erroneus number of
bits
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Distribution key is only supported on part of
primary key
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Disk memory attributes not yet
supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Variable stored attributes not yet
supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Only one autoincrement column allowed per table.
Having a table without primary key uses an autoincremented
hidden key, i.e. a table without a primary key can not have
an autoincremented column
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Result or attribute record must be a base table
ndbrecord, not an index ndbrecord
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Not all keys read when using option
SF_OrderBy
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Scan defined but not prepared
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Table with blobs does not support
refresh
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Only DBDICT and TRIX can send requests to
TRIX
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
TRIX block is not available yet, probably due to
node failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Internal error at index create/build
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Bad state at alter index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Inconsistency detected at alter index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Inconsistency detected at index usage
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Transaction already aborted
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Timeout expired
Сообщение об ошибке.
Timeout/deadlock during index build
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Status Error in NdbSchemaCon
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Only one schema operation per schema
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No schema operation defined before calling
execute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Schema transaction is already started
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Schema transaction not possible until upgrade
complete
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Schema transaction is not started
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Insert in hash table failed when getting table
information from Ndb
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
GetValue not allowed in Update
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
GetValue not allowed in Insert
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
SetValue not allowed in Read
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NULL value not allowed in primary key
search
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Missing getValue/setValue when calling
execute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Missing operation request when calling
execute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
GetValue not allowed for NdbRecord defined
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Non SF_MultiRange scan cannot have more than one
bound
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
User specified partition id not allowed for scan
takeover operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Blobs not allowed in NdbRecord delete result
record
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Incorrect combination of OperationOptions
optionsPresent, extraGet/SetValues ptr and
numExtraGet/SetValues
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Only one scan bound allowed for non-NdbRecord
setBound() API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Can only call setBound/equal() for an
NdbIndexScanOperation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Method not allowed for NdbRecord, use
OperationOptions or ScanOptions structure
instead
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Illegal instruction in interpreted
program
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Bad label in branch instruction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many instructions in interpreted
program
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbInterpretedCode::finalise() not
called
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Call to undefined subroutine
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Call to undefined subroutine, internal
error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
setBound() called twice for same key
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Pseudo columns not supported by
NdbRecord
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbInterpretedCode is for different
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attempt to set bound on non key
column
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbScanFilter constructor taking NdbOperation is
not supported for NdbRecord
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Wrong API. Use NdbInterpretedCode for NdbRecord
operations
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbInterpretedCode instruction requires that
table is set
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbInterpretedCode not supported for operation
type
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attempt to pass an Index column to createRecord.
Use base table columns only
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Unknown partition information type
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Duplicate partitioning information
supplied
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Wrong partitionInfo type for table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid or Unsupported PartitionInfo
structure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Explicit partitioning info not allowed for table
and operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
RecordSpecification has overlapping
offsets
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
RecordSpecification has too many
elements
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
getLockHandle only supported for primary key read
with a lock
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot releaseLockHandle until operation
executed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbLockHandle already released
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbLockHandle does not belong to
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbLockHandle original operation not executed
successfully
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbBlob can only be closed from Active
state
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
NdbBlob cannot be closed with pending
operations
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
RecordSpecification has illegal value in
column_flags
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Column types must be identical when comparing two
columns
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Transaction is already started
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Transaction is not started
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
You must call getNdbOperation before
executeScan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
There can only be ONE operation in a scan
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
takeOverScanOp, to take over a scanned row one
must explicitly request keyinfo on readTuples
call
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
You may only call readTuples() once for each
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
There may only be one operation in a scan
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
You can not takeOverScan unless you have used
openScanExclusive
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
You must call nextScanResult before trying to
takeOverScan
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many event have been defined
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Event name is too long
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Can't accept more subscribers
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Event not found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Creation of event failed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Stopped event operation does not exist. Already
stopped?
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Column defined in event does not exist in
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats sys tables NDB_INDEX_STAT_PREFIX do
not exist
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats for specified index do not
exist
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats methods usage error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats cannot allocate memory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Index stats samples data or memory cache is
invalid
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Index stats internal error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats sys tables NDB_INDEX_STAT_PREFIX
partly missing or invalid
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Mysqld: index stats thread not open for
requests
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Mysqld: index stats entry unexpectedly not
found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Mysqld: index stats request ignored due to recent
error
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Mysqld: index stats request aborted by stats
thread
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stats were deleted by another
process
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Event not found
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many active scans
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of scan records in LQH, increase
SharedGlobalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many active scans
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Scan take over error, restart scan
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Timeout expired
Сообщение об ошибке.
Time-out due to node shutdown not starting in
time
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Timeout expired
Сообщение об ошибке.
Time-out due to node shutdown not completing in
time
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
623
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
624
Ошибка MySQL.
HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of memory in Ndb Kernel, hash index part
(increase DataMemory)
Ошибка MySQL.
HA_ERR_KEY_NOT_FOUND
Тип ошибки NDB.
No data found
Сообщение об ошибке.
Tuple did not exist
Ошибка MySQL.
HA_ERR_FOUND_DUPP_KEY
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Tuple already existed when attempting to
insert
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Scan take over error, restart scan
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
632
Ошибка MySQL.
HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Table fragment hash index has reached maximum
possible size
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Too many hash indexes (should not
happen)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
Index UNDO buffers overloaded (increase
UndoIndexBuffer)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
System busy with other schema
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal temporary
Сообщение об ошибке.
Request to non-master
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid table format
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Attribute name too long
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Table name too long
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Inconsistency during table creation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
No more table metadata records (increase
MaxNoOfTables)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
No more attribute metadata records (increase
MaxNoOfAttributes)
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
No such table existed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Internal: Get by table name not supported, use
table id.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
System busy with node restart, schema operations
not allowed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
No more hashmap metadata records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Attribute name reused in table
definition
Ошибка MySQL.
HA_ERR_TABLE_EXIST
Тип ошибки NDB.
Schema object already exists
Сообщение об ошибке.
Schema object with given name already
exists
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
No such table existed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported array size
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Attribute array size too big
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Record too big
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported primary key length
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Nullable primary key not supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported alter table
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported character set in table or
index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Character string is invalid for given character
set
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Distribution key not supported for char attribute
(use binary attribute)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema object already exists
Сообщение об ошибке.
Event name already exists
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of event records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Busy during read of event table
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Primary Table in wrong state
Ошибка MySQL.
IE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid file type
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of file records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid file format
Ошибка MySQL.
IE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid filegroup for file
Ошибка MySQL.
IE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid filegroup version when creating
file
Ошибка MySQL.
HA_MISSING_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid tablespace
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Index on disk column is not supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Varsize bitfield not supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Tablespace has changed
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid tablespace version
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
File already exists,
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unable to drop table as backup is in
progress
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unable to alter table as backup is in
progress
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
DDL is not supported with mixed data-node
versions
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid extent size
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of filegroup records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Cant drop file, no such file
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Cant drop filegroup, no such
filegroup
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Cant drop filegroup, filegroup is
used
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Drop undofile not supported, drop logfile group
instead
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Cant drop file, file is used
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Given NODEGROUP doesn't exist in this
cluster
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Given fragmentType doesn't exist
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of string memory, please modify StringMemory
config parameter
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid schema object for drop
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Create file is not supported when
Diskless=1
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index created on temporary table must itself be
temporary
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Cannot create a temporary index on a
non-temporary table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
A temporary table or index must be specified as
not logging
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid undo buffer size
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many schema transactions
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid schema transaction key from NDB
API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid schema transaction id from NDB
API
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Too many schema operations
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Invalid schema transaction state
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Schema object is busy with another schema
transaction
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Node Recovery error
Сообщение об ошибке.
Schema transaction aborted due to
node-failure
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal temporary
Сообщение об ошибке.
Schema transaction aborted
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Missing schema operation at takeover of schema
transaction
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Logfile group not found
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Invalid hashmap
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Too many total bits in bitfields
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Default value for primary key column not
supported
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Object definition too big
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Schema feature requires data node
upgrade
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Out of LongMessageBuffer in DICT
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Out of schema transaction memory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Function not implemented
Сообщение об ошибке.
Wrong fragment count for fully replicated
table
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
A disk table must not be specified as no
logging
Ошибка MySQL.
HA_WRONG_CREATE_OPTION
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Non default partitioning without
partitions
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of attrinfo records in tuple manager,
increase LongSignalMemory
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
809
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
812
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too much attrinfo from application in tuple
manager
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Too many tables and attributes (increase
MaxNoOfAttributes or MaxNoOfTables)
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of memory in Ndb Kernel, table data (increase
DataMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Corrupt data received for
insert/update
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of add fragment operation records
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many nullable/bitfields in table
definition
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
833
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Illegal null attribute
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Trying to set a NOT NULL attribute to
NULL
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too long or too short default value
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Fixed-size column offset exceeded max.Use VARCHAR
or COLUMN_FORMAT DYNAMIC for memory-stored
columns
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
871
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
ordered index data (increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too much attrinfo (e.g. scan filter) for scan in
tuple manager
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
876
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
877
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
878
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
879
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Tried to read too much - too many getValue
calls
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unable to create table, out of data pages
(increase DataMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
882
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
883
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Stack overflow in interpreter
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Stack underflow in interpreter
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
More than 65535 instructions executed in
interpreter
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
887
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
888
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Table fragment fixed data reference has reached
maximum possible value (specify MAXROWS or increase no of
partitions)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
890
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Overload error
Сообщение об ошибке.
Data UNDO buffers overloaded (increase
UndoDataBuffer)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Unsupported type in scan filter
Ошибка MySQL.
HA_ERR_FOUND_DUPP_KEY
Тип ошибки NDB.
Constraint violation
Сообщение об ошибке.
Constraint violation e.g. duplicate value in
unique index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Tuple corrupted - wrong checksum or column data
in invalid format
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Update attempt of primary key via ndbcluster
internal api (if this occurs via the MySQL server it is a
bug, please report)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Rowid already allocated
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Inconsistent ordered index. The index needs to be
dropped and recreated
Ошибка MySQL.
HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of memory in Ndb Kernel, ordered index data
(increase DataMemory)
Ошибка MySQL.
HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Too many ordered indexes (increase
MaxNoOfOrderedIndexes)
Ошибка MySQL.
HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of fragment records (increase
MaxNoOfOrderedIndexes)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Out of attribute records (increase
MaxNoOfAttributes)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported attribute type in index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Unsupported character set in table or
index
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Insufficient space
Сообщение об ошибке.
Invalid ordered index tree node size
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
ordered scan operation (increase
SharedGlobalMemory)
Ошибка MySQL.
HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Index is being dropped
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Schema error
Сообщение об ошибке.
Index stat scan requested on index with
unsupported key size
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index stat scan requested with wrong lock
mode
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid index for index stats update
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid index stats request
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
No free index stats op
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid index stats sys tables
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Internal error
Сообщение об ошибке.
Invalid index stats sys tables data
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Cannot prepare index stats update
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Cannot execute index stats update
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Row operation defined after
refreshTuple()
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
copy tuples (increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of UNDO buffer memory (increase
UNDO_BUFFER_SIZE)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
stored procedure record (increase
SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
tup scan operation (increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Temporary Resource error
Сообщение об ошибке.
Out of transaction memory in local data manager,
acc scan operation (increase SharedGlobalMemory)
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid block name
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid error number. Should be >=
0.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Invalid trace number.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
The specified node is not an API
node.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Node shutdown in progress
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Node shutdown would cause system
crash
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No contact with database nodes }
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
No contact with the process (dead ?).
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Operation not allowed while nodes are starting or
stopping.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Batch size for sub scan cannot be smaller than
number of fragments.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Character operand was right truncated
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Character Parameter was right
truncated
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Query definition too large.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Query has operation with empty
projection.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Query defintion should have at least one
operation.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Query is in illegal state for this
operation.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
A previous query operation failed, which you
missed to catch.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Multiple 'parents' specified in linkedValues for
this operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Query with multiple scans may not be
sorted.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Numeric operand out of range
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Can't use same operand value to specify different
column values
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Incompatible datatype specified in operand
argument
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Parameter value has an incompatible
datatype
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Required argument is NULL
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Result row already defined for
NdbQueryOperation.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Index scan order was already set in query
definition.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Parallelism cannot be restricted for sorted
scans.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
All required 'key' values was not
specified
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Too many 'key' or 'bound' values was
specified
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Unknown 'parent' specified in
linkedValue
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Specified 'index' does not belong to specified
'table'
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Wrong type of index specified for this
operation
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
This method cannot be invoked on this type of
operation (lookup/scan/index scan).
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Send to process or receive failed.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
System shutdown in progress
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
Unsupported multi node shutdown. Abort option
required.
Ошибка MySQL.
DMEC
Тип ошибки NDB.
Application error
Сообщение об ошибке.
The process has wrong type. Expected a DB process.
В следующей таблице перечислены классификационные коды, используемые для
ошибок API NDB и их описаний. Они могут также быть найдены в файле
Таблица 2.90. В NDB 7.6.4 и позже, можно также получить описания для
классификационных кодов из столбца
Эта секция обеспечивает примеры кода, иллюстрирующие, как выполнить
некоторые основные задачи, используя API NDB. Все эти примеры могут быть собраны и запущены как предусмотрено, и
произвести типовой вывод, чтобы продемонстрировать их эффекты. Для программы API NDB, чтобы соединиться с кластером,
у файла кластерной конфигурации должен быть по крайней мере один
раздел Этот пример иллюстрирует использование синхронных транзакций в API NDB.
Это сначала создает базу данных
Собранная программа берет два аргумента: Строка подключения кластера NDB (см.
NDB Cluster Connection Strings) Правильный вывод из этой программы: Исходный код для этого примера может быть найден в
Этот пример демонстрирует синхронные транзакции и соединение
с многократными кластерами в единственном приложении API NDB. Исходный код для этой программы может быть найден в исходном дереве
кластера NDB в файле Файл примера раньше называли
До NDB 8.0.1 эту программу нельзя было выполнить успешно несколько раз
подряд во время той же самой сессии (Bug #27009386). Эта программа демонстрирует ошибки из-за неправильного обращения и
повторение неудавшихся транзакций, используя API NDB. Исходный код для этого примера может быть найден в файле
Есть много путей в программе, используя API NDB. В этом примере мы выполняем
две вставки в той же самой транзакции, используя
В приложениях API NDB есть два типа неудач, которые будут
приняты во внимание:
Сбои транзакции:
Если непостоянные, они могут быть обработаны, повторно выполнив транзакцию.
Ошибки приложения:
Они обозначаются Этот пример иллюстрирует, как использовать просмотр в NDB API.
Это показывает, как выполнить просмотр, как просмотреть для обновления и как
просмотреть для удаления, использовав классы
Исходный код для этого примера может найден в исходном дереве NDB Cluster
в файле Этот пример использует следующие классы и методы: Эта программа иллюстрирует, как использовать вторичные индексы в API NDB.
Исходный код для этого примера может быть найден в дереве исходных текстов
NDB Cluster в файле Этот файл ранее называли
Правильный вывод этой программы: Эта программа иллюстрирует, как использовать вторичные индексы в API NDB
при помощи интерфейса
Исходный код для этого примера может быть найден в исходных текстах NDB
Cluster в файле Когда работает в кластере с двумя узлами, правильный вывод такой: Этот пример иллюстрирует основные отличия между API старого стиля
Исходный код может быть найден в файле
Этот пример демонстрирует обработку событий API NDB. Исходный код для этой программы может быть найден в дереве
исходных текстов NDB Cluster в файле Этот пример иллюстрирует манипуляцию столбцом
Исходный код может быть найден в файле
В то время как тип данных MySQL, используемый в примере, на самом деле
Этот пример иллюстрирует манипуляцию столбцом
В то время как тип данных MySQL, используемый в примере, на самом деле
Эта программа вставки данных столбцов
Этот пример предполагает, что таблица
Эта программа использует много утилит, которые могут быть найдены в
Файл примера может быть найден в
До NDB 8.0.1 эту программу нельзя было запустить успешно
несколько раз подряд во время той же самой сессии (Bug #27009386). Эта программа вставляет столбцы
Пример использует таблицу: Файл примера может быть найден в
До NDB 8.0.1 эту программу нельзя было успешно выполнить несколько раз
подряд во время той же самой сессии (Bug #27009386). Файл Для получения дополнительной информации о типах данных MySQL в NDB API см.
раздел 2.1.3.2. В NDB 7.3.8, NDB 7.4.3 и позже в дереве исходных текстов NDB Cluster
каталог Далее приведены исходные тексты для этих файлов.
Глава 2. NDB API
NDB
.
2.1. Начало работы с NDB API
2.1.1. Компилирование и компоновка программ NDB API
2.1.1.1. Общие требования
libndbclient
и ее связанные заголовочные файлы,
они устанавливаются вместе с обычными библиотеками клиента MySQL и
заголовками. Они автоматически устанавливаются, когда вы
собираете MySQL с опцией
-DWITH_NDBCLUSTER=ON
или используете двоичный пакет, который поддерживает
NDB
.
2.1.1.2. Параметры компилятора
include
:include/mysql/storage/ndb/ndbapi
include/mysql/storage/ndb/mgmapi
$ mysql_config --cflags -I/usr/local/mysql/include/mysql -Wreturn-type \
-Wtrigraphs -W -Wformat -Wsign-compare \
-Wunused-mcpu=pentium4 -march=pentium4
--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
ndbapi
.2.1.1.3. Опции компоновки
NDB
. Библиотеки NDB
также требует некоторых функций от библиотеки
mystrings
, таким образом, это должно
быть также учтено.--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
WITH_MYSQL
, который может использоваться, чтобы
добавить --with-mysql
к файлу конфигурации, и это
автоматически устанавливает правильный компилятор и флаги компоновщика для
данной установки MySQL.mysql.m4
с определением
WITH_MYSQL
. Типичный полный пример состоит из
фактического исходного файла и следующих файлов помощника:acinclude
configure.in
Makefile.m4
README
,
NEWS
,
AUTHORS
и
ChangeLog
, однако, их
можно оставить пустыми.
aclocal
autoconf
automake -a -c
configure --with-mysql=
/mysql/prefix/path
m4_include([../mysql.m4])
AC_INIT(example, 1.0)
AM_INIT_AUTOMAKE(example, 1.0)
WITH_MYSQL()
AC_OUTPUT(Makefile)
bin_PROGRAMS = example
example_SOURCES = example.cc
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. Соединение с кластером
2.1.2.1. Включаемые файлы
NdbApi.hpp
.mysql.h
(в дополнение к
NdbApi.hpp
).mgmapi.h
.
2.1.2.2. Инициализация и парковка API
ndb_init()
.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()
.
Когда вызвано без любых аргументов, попытка подключения повторена
неопределенно долго, однажды в секунду, до успеха. Никакое сообщение не
сделано, пока связь не будет установлена.set_optimized_node_selection()
с
0
как его аргумент до запроса
connect()
.connect()
начинает связь только с узлом
управления NDB Cluster. Чтобы позволить связи с узлами данных, надо
использовать
wait_until_ready()
после
connect()
,
wait_until_ready()
ждет заданное число секунд
для связи с узлом данных, который будет установлен.example_init()
и
example_end()
,
которые включены в последующие примеры посредством включения файла
example_connection.h
.
#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
2.1.3.1. Имена объектов базы данных MySQL в API NDB
Table
и
Index
.
Значение признака database
одного из этих объектов всегда то же самое, как название базы данных MySQL,
которой принадлежат таблица или индекс. Значение признака
Table
или
Index
объекта всегда 'def
' (для
default).NDB
без модификации.
Имена таблиц, начинающиеся с 'NDB$
',
резервируются для внутреннего пользования, как таблица
SYSTAB_0
в базе данных
sys
.UNIQUE
,
создаются хэш-индекс и B-tree. Индекс B-tree использует название MySQL
индекса, название хэш-индекса произведено, приложив
'$unique
' к имени индекса.PRIMARY
.
Нет никакого дополнительного хэша, однако, уникальность первичного ключа
гарантируется, заставляя MySQL включить внутренний первичный ключ таблицы
NDB
.
NDB
совпадают со своими названиями в MySQL.
2.1.3.2. Обработка NDB API типов данных MySQL
TINYINT
,
SMALLINT
,
INT
и
BIGINT
отображаются к типам
NDB
, имеющим те же самые имена и требования
хранения, как их коллеги из MySQL.FLOAT
и
DOUBLE
отображаются к типам
NDB
, имеющим те же самые
имена и требования хранения.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);
VARCHAR
и VARBINARY
в и мз таблицы, используя API NDB.VARCHAR
или
VARBINARY
зависят от того, сохранена ли колонка в памяти или на диске:NDB
поддерживает колонки переменной ширины с 4-байтовым выравниванием.
Это означает что (например), последовательность
'abcde'
, сохраненная в столбце
VARCHAR(50)
, используя набор символов
latin1
, занимает 12 байтов: в этом случае
2-байтовые 5 символов это 10, округленные к следующему
кратному 4 значению, дают 12.VARCHAR
и
VARBINARY
сохранены как
столбцы фиксированной ширины. Это означает, что каждый из этих типов требует
того же самого объема хранения, как
CHAR
того же самого размера.BLOB
или
TEXT
составлена из двух отдельных частей.
Одна из них имеет фиксированный размер (256 байтов) и на самом деле сохранена
в оригинальной таблице. Другая состоит из любых данных сверх 256 байтов,
которые сохранили в скрытой таблице. Строки в ней всегда 2000 байт длиной.
Это означает, что запись size
байт
TEXT
или
BLOB
требует:
.size
<= 256256+2000*
((
байт иначе.size
-256)\2000)+1)--create-old-temporals=ON
.
NDB 7.5 и позже, то есть, версии NDB Cluster на основе MySQL 5.7 и позже,
могут прочитать и написать данные, используя старые временные типы, но не
могут составить таблицы, которые используют старые типы. Посмотрите
Fractional Seconds in Time Values.ALTER TABLE
на любой таблице, использующей старые типы,
или посредством поддержки и восстановления любых таких таблиц.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
2
(например,
Datetime2
). Предположите, что мы перезапускаем
mysqld с
--create-old-temporals=ON
и затем составьте таблицу t2
, также в
базе данных test
:
CREATE TABLE t2 (c1 DATETIME, c2 DATE, c3 TIME,
c4 TIMESTAMP, c5 YEAR) ENGINE=NDB;
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
TIME
,
DATETIME
и
TIMESTAMP
.
Новые версии этих типов отражены в API NDB как
Time2
, Datetime2
,
and Timestamp2
, соответственно, каждый
поддерживает доли секунды максимум с 6 цифрами точности.
Новые варианты используют кодирование с обратным порядком байтов
целочисленных значений, которые обрабатываются, чтобы определить
компоненты каждого временного типа.Точность
Надо байт Диапазон 0 0 Нет 1 1 0-9 2 1 0-99 3 2 0-999 4 2 0-9999 5 3 0-99999 6 3 0-999999
Time
: Старая
версия типа сохранена как 24-bit signed int
в формате с прямым порядком байтов (младший байт первый. Байт 0 (биты 0-7)
соответствует часам, байт 2 (биты 8-15) минутам и байт 2 (биты 16-23)
секундам, согласно этой формуле:
value = 10000 * hour + 100 * minute + second
Time2
: Новый тип
TIME
добавлен в NDB 7.3 и 7.4 (MySQL 5.6)
и сохранен как 3-байтовый обратный порядок байтов и от 0 до 3 байт для
дробной части. Целая часть закодирована как показано в следующей таблице:
Биты Смысл
Диапазон 23 Знаковый бит 0-1 22 Интервал 0-1 22-13 Час 1-1023 12-7 Минута 0-63 6-0 Секунда 0-63 Date
: Представление для типа MySQL
DATE
не изменено через версии NDB и использует
3-байтовое целое число без знака, сохраненное с прямым порядком байтов.
Кодирование показано здесь:
Биты Смысл
Диапазон 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 байт закодированы
как показано здесь:
Биты Смысл
Диапазон 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-байтовая дробная часть закодирована как показано
ранее в этой секции.ndb/src/common/util/NdbSqlUtil.cpp
. См. также
раздел 2.5.13,
который обеспечивает пример простого применения API NDB, которое использует
тип данных Timestamp2
.2.2. Иерархия классов NDB API
2.3. Классы, интерфейсы и структуры NDB API
NDB
API.
2.3.1. Структура AutoGrowSpecification
AutoGrowSpecification
.NdbDictionary
.AutoGrowSpecification
это структура данных,
определенная в классе
NdbDictionary
и применяется
в качестве параметра или возвращаемого значения некоторых методов классов
Tablespace
и
LogfileGroup
, см. разделы
2.3.38 и
2.3.13.AutoGrowSpecification
имеет следующие методы:
Имя
Описание min_free
??? max_size
??? file_size
??? filename_pattern
???
2.3.2. Класс Column
NdbDictionary
Column
символизуется его типом, который определяется многими спецификаторами типа:
BLOB
)NDB
.
Метод
Описание
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
столбца
Column
:
Тип
Описание
ArrayType
Определяет формат внутренней памяти колонки
StorageType
Определяет, сохранен ли столбец в памяти или на диске
Type
Тип данных колонки. У столбцов NDB
есть те же самые типы данных, как в MySQL
2.3.2.1. Column::ArrayType
Column
.
Имя
Описание ArrayTypeFixed
сохраненный как постоянное число байтов ArrayTypeShortVar
сохраненный как переменное число байтов, дополнительно 1 байт ArrayTypeMediumVar
сохраненный как переменное число байтов, дополнительно 2 байта
ArrayTypeShortVar
для типов
Var*
и ArrayTypeFixed
для остальных. Этого обычно хватает.2.3.2.2. Column::StorageType
Column
.StorageTypeMemory
.
Имя
Описание 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) могут использоваться в множествах.
Имя
Описание 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.
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()
.2.3.2.4.1. Column Constructor
Column
или скопировать существующий, используя конструктор класса.Column
,
созданный с использованием API NDB,
невидим сервером MySQL.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
.
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
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
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
.NDB
, это
ключевое разделение, включая линейное ключевое разделение.
bool getPartitionKey
(
void
) const
true
, если столбец часть ключа разделения для
таблицы, иначе false
.2.3.2.4.12.
Column::getPartSize()
BLOB
то есть, число байтов, которые сохранены в
каждом кортеже таблицы blob.BLOB
.
int getPartSize
(
void
) const
Tinyblob
это значение
0
(то есть, только действующие байты сохранены).
2.3.2.4.13.
Column::getPrecision()
int getPrecision
(
void
) const
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
0
. См. описание типа данных
DECIMAL
в
Numeric Data Types.2.3.2.4.16. Column::getSize()
int getSize
(
void
) const
2.3.2.4.17.
Column::getSizeInBytesForRecord()
NdbRecord
, в зависимости от типа колонки следующим образом:sizeof(NdbRecord*)
, который составляет 4 или 8
байтов (размер указателя зависит от платформы).getSize()
.
int getSizeInBytesForRecord
(
void
) const
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
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
.
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
)
buf
и длину данных
len
, как число значащих байтов.
Для типов фиксированного размера это размер типа. Для типов переменной длины,
ведущие 1 или 2 байта, которые указывают на
buffer
также содержат информацию о размере как
нормальную для типа.
2.3.2.4.24. Column::setInlineSize
BLOB
то есть, число начальных байтов, чтобы
сохранить в признаке blob таблицы. Эта часть обычно сохраняется в оперативной
памяти и может вноситься в указателе и интерпретироваться.BLOB
.
void setInlineSize
(
int
size
)
size
новый действующий размер для BLOB
.2.3.2.4.25. Column::setLength()
void setLength
(
int
length
)
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()
void setNullable
(
bool
nullable
)
true
позволяет вставить
NULL
в колонку, если
nullable
=
false
, этот метод выполняет эквивалент изменения колонки к
NOT NULL
в MySQL.
2.3.2.4.28. Column::setPartitionKey()
void setPartitionKey
(
bool
enable
)
enable
типа Boolean.
true
to this method
делает колонку частью ключа разделения таблицы, если
enable
=
false
, тогда столбец удален
из ключа разделения.
2.3.2.4.29. Column::setPartSize()
BLOB
то есть, число байтов, чтобы сохранить в
каждом кортеже BLOB
.BLOB
.
void setPartSize
(
int
size
)
size
это число байтов, чтобы сохранить в BLOB
.
Используя ноль для этого значения, только действующие байты могут быть
сохранены, в действительности делая тип колонки
TINYBLOB
.
2.3.2.4.30. Column::setPrecision()
void setPrecision
(
int
precision
)
2.3.2.4.31. Column::setPrimaryKey()
void setPrimaryKey
(
bool
primary
)
true
,
столбец становится частью первичного ключа таблицы, если
false
, тогда столбец удален
из первичного ключа.2.3.2.4.32. Column::setScale()
void setScale
(
int
scale
)
scale
, новый масштаб для десятичной
колонки. Для получения дополнительной информации о десятичной точности и
масштабе, посмотрите разделы
2.3.2.4.13 и
2.3.2.4.15.
2.3.2.4.33. Column::setStripeSize()
BLOB
то есть, количество последовательных
частей, чтобы сохранить в каждом узле кластера.BLOB
.
void setStripeSize
(
int
size
)
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()
сбрасывает
все атрибуты столбца к их значениям
по умолчанию, это должен быть первый метод, который вы называете, изменяя
признаки данной колонки.
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.Datafile
недоступен
приложениям API NDB, написанным для этих более старых выпусков.
Имя
Описание
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()
Uint32 getFileNo
(
void
) const
2.3.3.3. Datafile::getFree()
Uint64 getFree
(
void
) const
2.3.3.4. Datafile::getNode()
Uint32 getNode
(
void
) const
2.3.3.5.
Datafile::getObjectId()
virtual int getObjectId
(
void
) const
2.3.3.6.
Datafile::getObjectStatus()
virtual Object::Status getObjectStatus
(
void
) const
Status
. См.
раздел 2.3.31.4.
2.3.3.7. Datafile::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.3.8. Datafile::getPath()
const char* getPath
(
void
) const
2.3.3.9. Datafile::getSize()
Uint64 getSize
(
void
) const
2.3.3.10.
Datafile::getTablespace()
const char* getTablespace
(
void
) const
2.3.3.11. Datafile::getTablespaceId()
Uint32 getTablespaceId
(
void
) const
2.3.3.12. Datafile::setNode()
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
.
Имя
Описание
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.4.1. Конструктор класса Dictionary
Dictionary
.
protected Dictionary
(
Ndb&
ndb
)
Ndb
.
Dictionary
.
protected ~Dictionary
(
void
)
2.3.4.2. Dictionary::beginSchemaTrans()
hasSchemaTrans()
.Ndb
и его связанный
Dictionary
поддерживают одну транзакцию схемы за один раз.
По умолчанию каждая операция по метаданным выполняется отдельно,
то есть, для каждой операции транзакция схемы начата неявно, операция
(включая любые подоперации) выполняется и транзакция закончена.beginSchemaTrans()
.createTable()
).endSchemaTrans
.endSchemaTrans()
обрабатывает
и передает их. В случае ошибки немедленно прерывается транзакция.endSchemaTrans()
, ядро NDB
прерывает транзакцию. Если пользователь выходит перед возвратом из
endSchemaTrans()
,
ядро продолжает запрос, и о его статусе завершения
сообщает в регистрации кластера.
int beginSchemaTrans
(
void
)
2.3.4.3. Dictionary::createDatafile()
Datafile
.
int createDatafile
(
const Datafile&
dFile
)
Datafile
.
2.3.4.4. Dictionary::createEvent()
Event
.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
)
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* 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.4.10. Dictionary::createTable()
Table
.
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
)
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
)
table
, то есть таблица удалена
безотносительно того, действует ли она как родительская таблица, дочерняя
таблица или обе (Bug #18069680).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()
,
операции будут обработаны и переданы или прерваны и отменены.
Этот метод объединяет операционное выполнение и закрытие, отдельные методы
для этих задач не требуются. Этот метод можно вызвать успешно, даже если
никакая транзакция схемы в настоящее время неактивна.endSchemaTrans()
переписывать любой текущий код
ошибки. Поэтому необходимо сначала проверить и сохранить любой код ошибки,
который, возможно, следовал из предыдущей, неудавшейся операции.
int endSchemaTrans
(
Uint32
flags
= 0
)
endSchemaTrans()
любое из этих значений
SchemaTransFlag
:SchemaTransAbort
(= 1):
Заставляет транзакцию быть прерванной.SchemaTransBackground
(= 2):
Заставляет транзакцию выполняться в фоновом режиме, результат написан
регистрации кластера в то время, как приложение продолжается,
не ожидая ответа.NdbError
.
2.3.4.22. Dictionary::getDatafile()
Datafile
,
учитывая ID узла данных, где файл данных расположен и путь к файлу данных в
файловой системе того узла.
Datafile getDatafile
(
Uint32
nodeId
,
const char* path
)
nodeId
узла данных, где файл данных расположен.path
задает путь к файлу данных в файловой системе узла
(строка как указатель на символ).Datafile
, см.
раздел 2.3.3.
2.3.4.23. Dictionary::getDefaultHashMap()
int getDefaultHashMap
(
HashMap&
dst
,
Uint32 fragments
)
int getDefaultHashMap
(
HashMap&
dst
,
Uint32 buckets
,
Uint32 fragments
)
2.3.4.24. Dictionary::getEvent()
Event
,
представляющий событие, учитывая имя события.getEvent()
ассигнует память каждый раз, когда
это успешно вызывают. Необходимо иметь в виду, что последовательные вызовы
этого метода, используя то же самое событие, вызывают возвращение
многократных отдельных объектов.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()
int getHashMap
(
HashMap&
dst
,
const char* name
)
int getHashMap
(
HashMap&
dst
,
const Table* table
)
Table
.
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()
const Table* getTable
(
const char*
name
) const
name
.NULL
, если нет никакой таблицы с именем
name
.2.3.4.31.
Dictionary::getTablespace()
Tablespace
.
Tablespace getTablespace
(
const char*
name
)
Tablespace getTablespace
(
Uint32
id
)
name
имя табличного
пространства, последовательность (как указатель на символ).id
табличного пространства.Tablespace
, рассмотренный в
discussed in разделе 2.3.38.2.3.4.32.
Dictionary::getundofile()
undofile
,
учитывая ID узла, где файл отмены расположен и путь файловой системы к файлу.
undofile getundofile
(
Uint32
nodeId
,
const char* path
)
nodeId
узла данных, где расположен файл отмены, это значение передается как
32-bit unsigned integer.path
путь к файлу отмены
в файловой системе узла (строка как указатель на символ).undofile
. См. раздел 2.3.39.2.3.4.33.
Dictionary::hasSchemaTrans()
bool hasSchemaTrans
(
void
) const
TRUE
, если
транзакция схемы происходит, иначе FALSE
.2.3.4.34.
Dictionary::initDefaultHashMap()
int initDefaultHashMap
(
HashMap& dst, Uint32 fragments
)
int initDefaultHashMap
(
HashMap& dst,
Uint32 buckets,
Uint32 fragments
)
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()
int prepareHashMap
(
const Table&
oldTable
,
Table& newTable
)
int prepareHashMap
(
const Table&
oldTable
,
Table& newTable
,
Uint32 buckets
)
2.3.4.41.
Dictionary::releaseRecord()
NdbRecord
, когда это больше не необходимо.
void releaseRecord
(
NdbRecord*
record
)
NdbRecord
для очистки.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
имеет атрибуты:Атрибут
Тип
Начальное значение
Описание 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
Имя
Описание
Event()
Конструктор класса
~Event()
Деструктор
addEventColumn()
Добавляет столбец, в котором должны быть обнаружены события
addEventColumns()
Добавляет многочисленные колонки, в которых должны
быть обнаружены события
addTableEvent()
Добавляет тип события, которое должно быть обнаружено
getDurability()
Получает длительность события
getEventColumn()
Получает колонку, для которой определяется событие
getName()
Получает имя события
getNoOfEventColumns()
Получает количество столбцов, для которых определяется событие
getObjectId()
Получает идентификатор объекта события
getObjectStatus()
Получает статус объекта события
getObjectVersion()
Получает версию объекта события
getReport()
Получает варианты сообщения события
getTable()
Получает объект Table
, на
котором определяется событие
getTableEvent()
Проверка, должно ли событие быть обнаружено
getTableName()
Получает название таблицы, на которой определяется событие
mergeEvents()
Устанавливает флаг слияния события
setDurability()
Устанавливает длительность события
setName()
Определяет имя события
setReport()
Варианты сообщения события
setTable()
Устанавливает объект
Table
, на котором определяется событие
Ndb
и
NdbEventOperation
, устарев несколько других методов обоих классов
и добавив новый тип
TableEvent
.
getEventType2()
, и больше не обрабатывается,
используя методы
hasError()
и
clearError()
, которые теперь устарели.
В поддержку этого изменения, диапазон возможных типов
TableEvent
расширен перечисленными здесь:
TE_EMPTY
: Пустая эпоха.TE_INCONSISTENT
:
Непоследовательная эпоха: недостающие данные или переполнение.TE_OUT_OF_MEMORY
:
Непоследовательные данные: буфер событий или память переполнены.
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
:
Имя
Описание
TableEvent()
Представляет тип события таблицы
EventDurability()
Определяет объем события, доступность и время жизни
EventReport()
Определяет возможность сообщения для события таблицы
2.3.6.1. Event::addEventColumn()
Dictionary::createEvent()
прежде, чем любые ошибки будут обнаружены. Посмотрите
раздел 2.3.4.4.addEventColumns()
. См.
раздел 2.3.6.2.
void addEventColumn
(
unsigned
attrId
)
void addEventColumn
(
const char*
columnName
)
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
создает новый экземпляр с именем,
произвольно связанный с таблицей.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
.Имя
Описание 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
.Имя
Описание 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
-1
в случае ошибки.
2.3.6.11. Event::getObjectStatus()
virtual Object::Status getObjectStatus
(
void
) const
2.3.6.12. Event::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.6.13. Event::getObjectId()
virtual int getObjectId
(
void
) const
2.3.6.14. Event::getReport()
EventReport getReport
(
void
) const
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) слиты в единственное событие.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()
setReport()
с использованием
EventReport
= ER_DDL
(добавлено в тех же самых версиях кластера NDB).Event
с
именем myEvent
,
необходимо вызвать этот метод как показано здесь:
myEvent.setReport(NdbDictionary::Event::ER_DDL);
void setReport
(
EventReport
er
)
EventReport
.2.3.6.21. Event::setName()
void setName
(
const char*
name
)
name
для события (как постоянный указатель на символ).2.3.6.22. Event::setTable()
addEventColumn()
, чтобы
отвергнуть это поведение. Для получения дополнительной информации посмотрите
раздел 2.3.6.1.
void setTable
(
const NdbDictionary::Table&
table
)
void setTable
(
const NdbDictionary::Table*;
table
)
setTable()
вернет -1, если указатель таблицы NULL
(Bug
#16329082).2.3.6.23. Event::TableEvent
TableEvent
,
определенный классом
Event
.TableEvent
используется, чтобы классифицировать
типы событий, которые могут быть связаны с таблицами в API NDB.Имя
Описание 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::get_event_buffer_memory_usage()
.Имя
Тип
Начальное значение
Описание 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
.Имя
Описание
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
это перечисление, которое
представляет действие для внешнего ключа, когда обновление или удаление
выполняется на родительской таблице.Имя
Описание NoAction
NO ACTION
: Отсроченная проверка.Restrict
RESTRICT
:
Отклоните операцию на родительской таблице.Cascade
CASCADE
: Выполните операцию на строке из
родительской таблицы, выполните ту же самую операцию при соответствии
строкам в дочерней таблице.SetNull
SET NULL
: Выполните операцию на
строке из родительской таблицы, установите любые колонки внешнего ключа
соответствия в дочерней таблице к NULL
.SetDefault
SET DEFAULT
: В настоящее время не
поддержано в NDB Cluster.
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()
const char* getParentIndex
(
void
) const
2.3.8.9. ForeignKey::getChildIndex()
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()
ForeignKey
.
virtual Object::Status getObjectStatus
(
void
) const
ForeignKey
как значение типа
Object::Status
.
См. документацию этого типа для возможных значений и их интерпретации.
2.3.8.20. ForeignKey::getObjectId()
ForeignKey
.
virtual int getObjectId
(
void
) const
ForeignKey
как возвращено
Object::getObjectId()
.
2.3.8.21. ForeignKey::getObjectVersion()
ForeignKey
.
virtual int getObjectVersion
(
void
) const
ForeignKey
(integer) как возвращено
Object::getObjectVersion()
.2.3.9. Структура GetValueSpec
NdbOperation
.NdbRecord
.Имя
Тип
Описание column
const
Column
*Чтобы определить дополнительное значение, чтобы читать, вызывающий
должен обеспечить это, а также (произвольно
NULL
) указатель
appStorage
.appStorage
void*
Если этот указатель null, то полученное значение сохранено в памяти,
управляемой объектом
NdbRecAttr
. Иначе полученное значение
сохранено в местоположении, указанном (и все еще доступном с использованием
объекта NdbRecAttr
). Обязанность вызывающего гарантировать, что
следующие условия выполнены:
appStorage
указывает на достаточное место, чтобы сохранить любые возвращенные данные.
appStorage
,
не использована снова или освобождена до окончания
execute()
.recAttr
NdbRecAttr
*После того, как операция определяется,
recAttr
содержит указатель на
объект NdbRecAttr
для получения данных.
GetValueSpec
.2.3.10. Класс HashMap
Object
.Имя
Описание
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
не требует никаких аргументов. Конструктор копии также доступен.
HashMap HashMap
(
void
)
HashMap HashMap
(
const HashMap&
hashmap
)
virtual ~HashMap
(
void
)
HashMap
, который будет скопирован.
HashMap
, возможно копия существующего.2.3.10.2. HashMap::setName()
void setName
(
const char*
name
)
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
).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
2.3.10.10. HashMap::getObjectId()
virtual int getObjectId
(
void
) const
2.3.11. Класс Index
Index
и его публичные члены.NdbDictionary
.NDB Cluster
. Это потомок класса
NdbDictionary
, использующий класс
Object
.Имя
Описание
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
.
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
2.3.11.9.
Index::getObjectStatus()
virtual Object::Status getObjectStatus
(
void
) const
Status
, см.
раздел 2.3.31.4.
2.3.11.10. Index::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.11.11. Index::getObjectId()
virtual int getObjectId
(
void
) const
2.3.11.12. Index::getTable()
const char* getTable
(
void
) const
2.3.11.13. Index::getType()
Type getType
(
void
) const
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
.Имя
Описание Undefined
Неопределенный тип объекта (начальная буква/значение
по умолчанию) UniqueHashIndex
Уникальный неупорядоченный хэш-индекс (только тип индекса
поддержанный в настоящее время) OrderedIndex
Групповой, упорядоченный индекс
2.3.12. Структура IndexBound
NdbIndexScanOperation
.IndexBound
это структура, используемая, чтобы описать границы просмотра индекса для
NdbRecord
.Имя
Тип
Описание 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.13. Класс LogfileGroup
LogfileGroup
,
который представляет группу файла журнала NDB Cluster Disk Data.NdbDictionary
.Имя
Описание
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
2.3.13.5. LogfileGroup::getObjectStatus()
LogfileGroup
.
virtual Object::Status getObjectStatus
(
void
) const
Status
группы файла журнала, см.
раздел 2.3.31.4.
2.3.13.6. LogfileGroup::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.13.7. LogfileGroup::getUndoBufferSize()
UNDO
.
Uint32 getUndoBufferSize
(
void
) const
UNDO
в байтах.
2.3.13.8. LogfileGroup::getUndoFreeWords()
UNDO
группы файла журнала.
Uint64 getUndoFreeWords
(
void
) const
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
.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.
Атрибут
Тип
Начальное значение
Описание ptr
const void*
Нет
Указатель на одно или более значений ключа распределения len
unsigned
Нет
Длина указателя
2.3.16. Класс Ndb
NDB
,
это основной класс API NDB.Ndb
.
При помощи нескольких объектов Ndb
возможно
реализовать многопоточное приложение. Необходимо помнить, что один объект
Ndb
не может быть разделен между потоками,
однако, для единственного потока возможно использовать многократные объекты
Ndb
. Единственный прикладной процесс может
поддержать максимум объектов 4711 Ndb
.Ndb
потребляет память в пропорции к
размеру самой большой операции, выполненной за жизнь объекта. Это особенно
примечательно в случаях больших транзакций или использования столбцов
BLOB
или
TEXT
.
Эта память выделяется для целой жизни объекта и когда-то используется таким
образом, единственный способ освободить эту память состоит в том, чтобы
разрушить объект (и затем создать новый экземпляр при желании).Ndb
ориентирован на многопотоковое
исполнение в этом случае каждый объект Ndb
может быть обработан одним потоком за один раз. Если
Ndb
передан другому потоку, тогда приложение
должно гарантировать, что барьер памяти используется, чтобы гарантировать,
что новый поток видит все обновления, выполненные предыдущим потоком.Ndb
, чтобы выполнить операции на различных
кластерах в отдельном приложении. Посмотрите
здесь
для условий и ограничений, относящихся к такому использованию.Имя
Описание
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_cluster_connection
используемый, чтобы создать экземпляр Ndb
без
удаления объекта Ndb
(Bug #19999242).catalogName
дополнительный параметр, обеспечивающий пространство имен для таблиц
и индексов, созданных в любой связи из объекта
Ndb
.schemaName
обеспечивает дополнительное пространство имен для таблиц
и индексов, созданных в данном каталоге.Ndb
.Ndb
нужно вызвать, чтобы закончить экземпляр
Ndb
.
Это не требует никаких аргументов и любой специальной обработки.
2.3.16.2. Ndb::closeTransaction()
NdbTransaction::close()
). Необходимо назвать один из этих двух
методов, чтобы закончить транзакцию, как только это было закончено.
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).hashvalueptr
.
2.3.16.4. Ndb::createEventOperation()
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
.2.3.16.6. Ndb::getDictionary()
Dictionary
содержит метаинформацию обо всех таблицах в кластере.
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()
nextEvent()
. Можно использовать этот метод, чтобы получить итоговую
информацию в течение эпохи (такой как список всех таблиц)
прежде, чем обработать данные о событии.getNextEventOpInEpoch2()
.
const NdbEventOperation* getGCIEventOperations
(
Uint32*
iter
,
Uint32* event_types
)
*
.iter
=0
NULL
, когда больше нет операций событий. Если
event_types
не
NULL
, тогда после запроса метода это содержит
битовую маску полученных типов событий.2.3.16.10.
Ndb::get_eventbuf_max_alloc()
ndb_eventbuffer_max_alloc
.
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
это сумма на самом деле
используемой буферной памяти событий в байтах.
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
.
void get_event_buffer_memory_usage
(
EventBufferMemoryUsage&
)
EventBufferMemoryUsage
, которая получает
данные об использовании.2.3.16.13.
Ndb::getHighestQueuedEpoch()
getLatestGCI()
.
pollEvents2()
(Bug #20700220).
Uint64 getHighestQueuedEpoch
(
void
)
2.3.16.14. Ndb::getLatestGCI()
getHighestQueuedEpoch()
.
Uint64 getLatestGCI
(
void
)
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.
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
, если есть.2.3.16.20. Ndb::getReference()
Ndb
. Это то же самое значение, которое возвращено для данной операции,
соответствующей этому объекту в выводе
DUMP 2350
.
Uint32 getReference
(
void
)
2.3.16.21. Ndb::init()
Ndb
.
int init
(
int
maxNoOfTransactions
= 4
)
init()
берет единственный параметр
maxNoOfTransactions
типа integer.
Этот параметр определяет максимальное количество параллельных объектов
NdbTransaction
, которые могут быть обработаны этим экземпляром
Ndb
.
Максимальное разрешенное значение для
value for maxNoOfTransactions
=
1024, по умолчанию 4.NdbTransaction
.int
, который может иметь любой
следующие два значения:Ndb
был инициализирован успешно.2.3.16.22. Ndb::isConsistent()
NdbEventOperation::getEventType2()
, чтобы
определить тип события в этом экземпляре, имеет ли событие тип
TE_INCONSISTENT
. См.
раздел 2.3.6.23.
bool isConsistent
(
Uint64&
gci
)
true
, если все события последовательны.
2.3.16.23. Ndb::isConsistentGCI()
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, затем снова соединитесь с
кластером, когда он становится доступным снова.
bool isExpectingHigherQueuedEpochs
(
void
)
pollEvents2()
, или в случае сбоя кластера.
2.3.16.25. Ndb::nextEvent()
nextEvent2()
.
NdbEventOperation* nextEvent
(
void
)
NdbEventOperation
, представляющий следующее событие в подписной
очереди, если есть такое событие. Если нет никакого события в очереди, он
возвращает NULL
.pollEvents()
вернул 0 (Bug #18716991).2.3.16.26. Ndb::nextEvent2()
pollEvents2()
наполнит очередь, пока очередь
событий не будет пуста.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()
pollEvents2()
вместо этого метода.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
: Нет никаких доступных событий.
~(Uint64)0
) указывает на сбой кластера
(Bug #18753887), 1 возвращен, сталкиваясь с исключительным событием, кроме
тех случаев, когда найдены только события
TE_EMPTY
, как описано позже в этой секции.
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()
pollEvents()
.
int pollEvents2
(
int
aMillisecondNumber
,
Uint64* highestQueuedEpoch
= 0
)
0
).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()
ndb_eventbuffer_max_alloc
.
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
.
int set_eventbuffer_free_percent
(
unsigned
pct
)
pct
)
буферной памяти событий, которая должна присутствовать.
Действительный диапазон равняется 1-99 включительно.
2.3.16.34. Ndb::setNdbObjectName()
Ndb
при отладке. Это имя может тогда быть
получено, используя
getNdbObjectName()
(Bug #18419907).
Это должно быть сделано до запроса
init()
для этого объекта, пытаясь определить имя после, инициализация
терпит неудачу с ошибкой.Ndb
, последующие попытки после определения имени
терпят неудачу с ошибкой.
int setNdbObjectName
(
const char*
name
)
name
.
2.3.16.35. Ndb::startTransaction()
NdbTransaction::close()
или
Ndb::closeTransaction()
.
Отказ сделать это прерывает транзакцию. Это должно быть сделано независимо от
конечного результата транзакции, даже если она терпит неудачу из-за ошибки.
NdbTransaction* startTransaction
(
const NdbDictionary::Table*
table
= 0,
const char* keyData
= 0,
Uint32* keyLen
= 0
)
table
:
Указатель на объект
Table
. Это используется, чтобы определить, на котором узле должен
работать операционный координатор.keyData
:
Указатель на соответствие ключа разделения таблице
table
.keyLen
:
Длина ключа разделения в байтах.
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 МБ обычно достаточный размер.
NdbTransaction* startTransaction
(
const NdbDictionary::Table*
table
,
Uint32 partitionId
)
NoOfReplicas
= 2
в кластере с 4 узлами данных), вы увидите улучшение работы при помощи
осведомленной о распределении версии этого метода.startTransaction()
.NdbTransaction
, при ошибке вернет
NULL
.
2.3.17. Класс Ndb_cluster_connection
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
указывающий на второй кластер.config.ini
).Ndb_cluster_connection
принадлежит единственному серверу управления, имя
хоста которого или IP-адрес используются в создании этого объекта (как
параметр connection_string
конструктора), как только объект создается, он не может использоваться, чтобы
начать связь с различным сервером управления.Ndb
, использующий эту связь (Ndb_cluster_connection
), не может быть снова использован, чтобы соединиться с иным сервером
управления кластера (и таким образом с иной коллекцией узлов данных,
составляющих кластер). Любой экземпляр
Ndb
связан с определенным Ndb_cluster_connection
когда создан и этот Ndb_cluster_connection
в свою очередь связан с единственным и уникальным сервером управления,
когда он создается.Ndb
и
Ndb_cluster_connection
.Ndb_cluster_connection
и
Ndb
для соединения с каждым сервером управления кластера.Имя
Описание
Ndb_cluster_connection()
Конструктор создает связь с кластером узлов данных
connect()
Соединяется с сервером управления кластера
get_auto_reconnect()
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()
Ndb_cluster_connection
set_data_node_neighbour()
SУстанавливает соседний узел для оптимального
размещения операционного координатора
set_max_adaptive_send_time()
set_name()
Обеспечивает название связи
set_num_recv_threads()
set_recv_thread_cpu()
set_optimized_node_selection()
Используемый, чтобы управлять поведением выбора узла
set_service_uri()
URI для публикации в таблице
ndbinfo.processes
set_timeout()
Устанавливает тайм-аут связи
unlock_ndb_objects()
Ndb
unset_recv_thread_cpu()
wait_until_ready()
Ждет, пока связь с одним или более узлами данных не будет успешной
2.3.17.1. Конструктор класса Ndb_cluster_connection
Ndb
.
Таким образом каждое применение API NDB требует использования
Ndb_cluster_connection
.Ndb_cluster_connection
имеет двух конструкторов. Первый из них:
Ndb_cluster_connection
(
const char*
connection_string
= 0
)
connection_string
,
указывая на местоположение сервера управления.
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 значений:
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
)
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 ()
2.3.17.7. Ndb_cluster_connection::get_next_ndb_object()
Ndb
,
получая их по одному.
const Ndb* get_next_ndb_object
(
const Ndb*
p
)
Ndb
, который был получен или NULL
.Ndb
или
NULL
, если больше нет объектов
Ndb
.
Ndb
, выполните следующее:lock_ndb_objects()
.
Это предотвращает создание любых новых экземпляров
Ndb
до вызова
unlock_ndb_objects()
.Ndb
, передав
NULL
в
get_next_ndb_object()
.
Можно получить второй объект Ndb
, передавая
указатель, полученный первым вызовом, следующему
get_next_ndb_object()
и т.д.
Когда указатель на последний доступный экземпляр
Ndb
используется, метод вернет NULL
.Ndb
,
необходимо повторно включить создание объектов
Ndb
вызовом
метода
unlock_ndb_objects()
.
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
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.12. Ndb_cluster_connection::set_auto_reconnect()
AutoReconnect = 1
в
файле config.ini
или вызывая этот метод с 1 как
входное значение. Вызов метода с 0 имеет тот же самый эффект как задание
AutoReconnect
(также введен в тех версиях кластера NDB) к 0, то есть, узлы API вынуждены
создать новые связи.AutoReconnect
из файла
config.ini
.
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.
void set_data_node_neighbour
(
Uint32
neighbour_node
)
2.3.17.14. Ndb_cluster_connection::set_max_adaptive_send_time()
void set_max_adaptive_send_time
(
Uint32
milliseconds
)
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()
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
)
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
)
threshold
. 16 или более высокие значения означают, что потоки получения
никогда не используются в качестве приемников. 0 указывает, что поток
получения всегда активна, это сохраняет права опроса для его собственного
исключительного использования, эффективно блокируя все пользовательские
потоки от становления приемниками. В таких случаях нужно соблюдать
аккуратность, чтобы гарантировать, что поток получения не конкурирует с
пользовательским потоком за ресурсы CPU, предпочтительно для него быть
привязанным к CPU для его собственного исключительного использования.
По умолчанию значение 8.-1
указывает на ошибку,
любое другое значение указывает на успех.
2.3.17.19. Ndb_cluster_connection::set_service_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 знаков.//
).
2.3.17.20. Ndb_cluster_connection::set_recv_thread_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
)
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 значения.
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.23. Ndb_cluster_connection::unset_recv_thread_cpu()
set_recv_thread_cpu()
.
int unset_recv_thread_cpu
(
Uint32
recv_thread_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
хранятся в 2 местах:NDB$BLOB_
, где
tid
_
cid
tid
ID таблицы, а
cid
ID столбца blob.Column
, когда таблица составлена. Посмотрите
раздел 2.3.2.NdbBlob
поддерживает 3 типа доступа к данным.
Эти типы доступа к данным могут быть применены в комбинации при условии, что
они используются в порядке, данном выше.NdbBlob
getValue()
и
setValue()
используются, чтобы подготовить
чтение или запись BLOB
известного размера.setActiveHook()
используется, чтобы определить установленный порядок, который вызван, как
только обработчик становится активным.readData()
и
writeData()
используются, чтобы читать и писать
BLOB
, имеющие произвольные размеры.BLOB
вступают в силу, когда следующая транзакция выполняется. В некоторых случаях
NdbBlob
вынужден выполнить неявное выполнение.
Чтобы избежать этого, необходимо всегда воздействовать на
полные сегменты данных.NdbTransaction::executePendingBlobOps()
для сброса чтения и записи, который избегает любого штрафа выполнения, если
никакие операции не находятся на рассмотрении. Это не требуется после
выполнения операций или после следующего результата просмотра.NdbBlob
также поддерживает чтение
данные перед или после blob из событий. Обработчик может быть прочитан после
того, как следующее событие на главной таблице было получено.
Данные становятся доступными немедленно. См.
раздел 2.3.21.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
не создаются атомарно.Имя
Описание
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
при ошибке.Имя
Описание
ActiveHook()
Отзыв для
NdbBlob::setActiveHook()
State()
Представляет статусы, которые могут быть приняты
NdbBlob
.
2.3.18.1. NdbBlob::ActiveHook
setActiveHook()
, см.
раздел 2.3.18.17.ActiveHook
это
пользовательский тип данных, определенный так:
typedef int ActiveHook
(
NdbBlob*
me
,
void* arg
)
NdbBlob::setActiveHook()
, немедленно вызван,
как только подготовленная операция была выполнена (но не передана).
Любые вызовы
getValue()
или
setValue()
выполняются сначала. Обработчик BLOB
активен, так что
readData()
или
writeData()
могут использоваться, чтобы управлять значением
BLOB
. Определенный пользователями аргумент
передается вместе с
NdbBlob
.
setActiveHook()
вернет
ненулевое значение в случае ошибки.
2.3.18.2. NdbBlob::blobsFirstBlob()
NdbBlob* blobsFirstBlob
(
void
)
2.3.18.3. NdbBlob::blobsNextBlob()
NdbBlob* blobsNextBlob
(
void
)
2.3.18.4. NdbBlob::close()
State
= Active
.LM_Read
или
LM_Exclusive
как
LockMode
, операцию чтения можно открыть
только когда все обработчики, созданные на этой операции, были закрыты.LM_CommittedRead
, способ автоматически
модернизирован до LM_Read
, чтобы гарантировать
последовательность. В этом случае, когда все обработчики для строки были
закрыты, операция разблокировки строки автоматически выполняется методом
close()
, который добавляет надвигающуюся
операцию записи к blob. Модернизированная блокировка выпущена после вызова
execute()
.
int close
(
bool
execPendingBlobOps
= true
)
execPendingBlobOps
.
Если значение этого параметра true
(по
умолчанию), любые надвигающиеся операции по blob сброшены прежде, чем
обработчик закрывается. Если
execPendingBlobOps
=
false
, предполагается, что у обработчика нет
ожидающих операций чтения или записи.
2.3.18.5. NdbBlob::getBlobEventName()
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()
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
)
2.3.18.8. NdbBlob::getLength()
int getLength
(
Uint64&
length
)
NULL
этот метод вернет
0
. Чтобы отличить blob длины
0
, используйте
getNull()
.2.3.18.9. NdbBlob::getNull()
NULL
.
int getNull
(
int&
isNull
)
isNull
.
У этого параметра есть одно из следующих значений, интерпретируемых
как показано здесь:-1
: blob не определен. Если это
blob без события, этот результат вызывает статусную ошибку.0
: blob не null.1
: blob =
NULL
.2.3.18.10.
NdbBlob::getNdbError()
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.18.12. NdbBlob::getPos()
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()
getNull()
, чтобы проверять на
NULL
, getLength()
,
чтобы получить фактическую длину blob и проверить на усечение.
getValue()
устанавливает текущее положение
чтения-записи в пункт после конца данных, которые были прочитаны.
int getValue
(
void*
data
,
Uint32 bytes
)
data
для чтения,
вторым является количество bytes
.
0
при успехе,
-1
при неудаче.2.3.18.15. NdbBlob::getVersion()
void getVersion
(
int&
version
)
-1
: Это
нормальный (основанный на запросе) blob.0
:
Это базирующийся на операции событий blob после изменения в его данных.
1
:
Это базирующийся на операции событий blob
до любого изменения в его данных.getVersion()
всегда успешно, предполагая, что
это вызвано как метод действительного экземпляра
NdbBlob
.2.3.18.16. NdbBlob::readData()
int readData
(
void*
data
,
Uint32&bytes
)
readData()
принимает
указатель на data
для чтения и
ссылку на количество bytes
.0
при успехе,
-1
при ошибке. После успешного вызова
data
указывает на данные, которые
были прочитаны, а bytes
считает число байтов.
2.3.18.17. NdbBlob::setActiveHook()
int setActiveHook
(
ActiveHook*
activeHook
,
void* arg
)
ActiveHook
,
это отзыв, как объяснено в
разделе 2.3.18.1.void
для любых данных, которые будут переданы отзыву.0
при успехе,
-1
при неудаче.2.3.18.18. NdbBlob::setNull()
NULL
.
int setNull
(
void
)
0
при успехе,
-1
при неудаче.2.3.18.19. NdbBlob::setPos()
int setPos
(
Uint64
pos
)
pos
(unsigned 64-bit integer),
который является положением для чтения или написания данных. Значение
pos
должно быть между
0
и текущей длиной blob.0
при успехе,
-1
при неудаче.2.3.18.20. NdbBlob::setValue()
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
может принять любой из этих статусов.Имя
Описание Idle
NdbBlob
еще не был подготовлен к использованию ни с какими операциями.Prepared
Это состояние
NdbBlob
до операционного выполнения.Active
Это состояние обработчика BLOB
после выполнения или установки следующего результата, но прежде,
чем транзакция передается.Closed
Это состояние происходит после того, как
транзакция была передана. Invalid
Это следует за отменой или завершением транзакции.
2.3.18.22. NdbBlob::truncate()
int truncate
(
Uint64
length
= 0
)
truncate()
берет единственный параметр, который
определяет новую длину length
,
к которой blob должна быть усечена. Этот метод не имеет никакого эффекта,
если length
больше, чем текущая длина (которую можно проверить использованием
getLength()
).0
при успехе,
-1
при неудаче.2.3.18.23. NdbBlob::writeData()
NdbBlob
.
После успешного вызова положение чтения-записи будет на уровне первого байта
после данных, которые были записаны.
int writeData
(
const void*
data
,
Uint32 bytes
)
data
для записи и количество байт
bytes
в них.0
при успехе,
-1
при неудаче.2.3.19. Класс NdbDictionary
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.NdbDictionary
самостоятельно не имеет никаких публичных методов экземпляра, только
статические методы, которые используются для работы с объектами
NdbRecord
.
Операции, не использующие NdbRecord
,
достигаются посредством подметодов экземпляров классов
NdbDictionary
.Имя
Описание
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()
NdbRecord
. Вернет false
, если никакой признак
ID не определяется.
static bool getFirstAttrId
(
const NdbRecord*
record
,
Uint32& firstAttrId
)
NdbRecord
и ссылка на признак
(firstAttrID
).false
,
когда никакой признак ID не может быть получен.
2.3.19.3. NdbDictionary::getNextAttrId()
NdbRecord
после переданного признака ID. Вернет
false
, когда больше нет признаков ID,
которые будут возвращены.
static bool getNextAttrId
(
const NdbRecord*
record
,
Uint32& attrId
)
NdbRecord
и ссылка на ID признака.false
,
когда никакой признак ID не может быть получен.
2.3.19.4. NdbDictionary::getNullBitOffset()
NdbRecord
. Вернет
false
, если признак ID не присутствует.
static bool getNullBitOffset
(
const NdbRecord*
record
,
Uint32 attrId
,
Uint32& bytes
,
Uint32& bit
)
NdbRecord
record
,
в которой можно получить смещение данного признака ID
(attrId
). Смещение выражается как
число байт (bytes
) плюс число бит в
последнем байте (bit
).false
,
если признак с данным ID не присутствует.
2.3.19.5. NdbDictionary::getOffset()
NdbRecord
.
Вернет false
, если признак ID не присутствует.
static bool getOffset
(
const NdbRecord*
record
,
Uint32 attrId
,
Uint32& offset
)
offset
данного признака ID с начала строки
NdbRecord
.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()
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 колонки.2.3.19.11.
NdbDictionary::isNull()
true
or false
.
Местоположение пустого бита относительно указателя строки получено из
переданного объекта
NdbRecord
. Если столбец не может быть null или он не часть
определения
NdbRecord
, метод вернет false
.
static bool isNull
(
const NdbRecord*
record
,
const char* row
,
Uint32 attrId
)
NdbRecord
, описывающий формат строки,
указатель на начало данных строки и признак ID колонки, чтобы проверить.true
,
если признак ID существует в этом
NdbRecord
, он может быть null и пустой бит
этой строки установлен, иначе Boolean false
.2.3.19.12.
NdbDictionary::setNull()
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
).attrId
не часть record
или не может быть null.2.3.20. Структура NdbError
NdbError
,
которая содержит статус и другую информацию об ошибках, включая коды
ошибок, классификации и сообщения.NdbError
состоит из шести частей, перечисленных здесь, которые устарели:Status
. См.
раздел 2.3.20.2.Classification
. См.
раздел 2.3.20.1
для возможных классификаций и их интерпретации. Дополнительная информация
предоставляется в разделе
2.4.4.storage/ndb/src/ndbapi/ndberror.c
в исходных текстах NDB Cluster.NULL
.Ndb::getNdbErrorDetail()
.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
Имя
Описание NoError
Указывает на успех (никакая ошибка не произошла) ApplicationError
Ошибка произошла в прикладной программе NoDataFound
Операция чтения потерпела неудачу из-за одной или
нескольких недостающих записей ConstraintViolation
Ограничительное нарушение произошло, такое как попытка вставить кортеж,
имеющий значение первичного ключа, который уже
есть в целевой таблице SchemaError
Ошибка произошла, пытаясь создать или использовать таблицу InsufficientSpace
Было недостаточно памяти для данных или индексов TemporaryResourceError
С этим типом ошибки, как правило, сталкиваются, когда есть слишком
много активных транзакций NodeRecoveryError
Это временный отказ, который был, вероятно, вызван происходящим
восстановлением узла, например, когда информация, посланная между приложением
и NDB
потеряна, или когда
есть изменение распределения.OverloadError
Этот тип ошибки часто вызывается, когда недостаточно
пространства файла журнала TimeoutExpired
Тайм-аут часто вызываемый мертвой блокировкой UnknownResultError
Неизвестно, была ли транзакция передана InternalError
Серьезная ошибка произошла в NDB
FunctionNotImplemented
Приложение попыталось использовать функцию, которая еще не осуществляется
UnknownErrorCode
Это замечено, если обработчик ошибок NDB
не может определить правильный код ошибки, чтобы сообщитьNodeShutdown
Это вызывается закрытием узла SchemaObjectExists
Приложение попыталось создать объект схемы,
который уже существует InternalTemporary
Запрос был отправлен не к основному узлу
2.3.20.2. NdbError::Status
Имя
Описание Success
Никакая ошибка не произошла TemporaryError
Временная и обычно исправимая ошибка, приложение должно повторить
операцию, дающую начало ошибке PermanentError
Систематическая ошибка, не восстанавливаемая UnknownResult
Результат или статус операции неизвестны
2.3.21. Класс NdbEventOperation
NdbEventOperation
,
который используется, чтобы наблюдать изменения (события) в базе данных. Это
обеспечивает базовую функциональность, которая ранее была в
NDB Cluster Replication.NdbEventOperation
представляет событие базы данных.NdbEventOperation
создаются как результат вызовов метода на объектах
Ndb
и
NdbDictionary
, согласно следующим условиям:Dictionary::createEvent()
.
Этот метод возвращает экземпляр класса
Event
.NdbEventOperation
создается,
используя
Ndb::createEventOperation()
,
который действует на экземпляр
Event
.Ndb::dropEventOperation
.NdbEventOperation
в настоящее время фиксируются во время компиляции как 2 *
MaxNoOfTables
.INSERT
,
DELETE
и UPDATE
,
а также все изменения признака посылают в API, даже если были определены
только некоторые признаки. Однако они скрыты от пользователя, и только
соответствующие данные показывают после запроса
Ndb::nextEvent()
.Ndb::pollEvents()
могут произойти и таким образом следующий вызов
nextEvent()
вернет 0, так как не было никаких
доступных данных. В таких случаях просто вызовите
pollEvents()
еще раз.INSERT
обычно обрабатываются, рассматривая такие
вставки как REPLACE
.
Ndb_select_all -d sys 'NDB$EVENTS_0'
Имя
Описание
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()
void clearError
(
void
)
2.3.21.2. NdbEventOperation::execute()
NdbEventOperation
, так, чтобы это могло
начать получать события. Измененные значения атрибута могут быть получены
после того, как
Ndb::nextEvent()
вернет значение кроме
NULL
.getValue()
,
getPreValue()
,
getBlobValue()
или
getPreBlobValue()
должен быть вызван перед
invoking execute()
.
int execute
(
void
)
0
при успехе и
-1
при неудаче.
2.3.21.3. NdbEventOperation::getBlobHandle()
getValue()
для blob. Обработчик blob
(NdbBlob
),
возвращенный этим методом поддерживает только операции чтения.getPreBlobHandle()
.
NdbBlob* getBlobHandle
(
const char*
name
)
name
атрибута blob.NdbBlob
.
2.3.21.4. NdbEventOperation::getEpoch()
getGCI()
, который теперь устарел.
Uint64 getEpoch
(
void
) const
2.3.21.5. NdbEventOperation::getEventType()
TableEvent
).getEventType2()
.
NdbDictionary::Event::TableEvent getEventType
(
void
) const
TableEvent
.
2.3.21.6. NdbEventOperation::getEventType2()
TableEvent
).getEventType()
.
NdbDictionary::Event::TableEvent getEventType2
(
void
) const
TableEvent
.
2.3.21.7. NdbEventOperation::getGCI()
getEpoch()
.
Uint64 getGCI
(
void
) const
2.3.21.8. NdbEventOperation::getLatestGCI()
Ndb::getHighestQueuedEpoch()
.
Uint64 getLatestGCI
(
void
) const
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()
NdbRecAttr* getPreValue
(
const char*
name
,
char* value
= 0
)
name
из признака (как постоянный указатель на символ).value
таким образом, что:NULL
,
значение атрибута возвращено в этом параметре.NULL
,
значение атрибута сохранено только в объекте
NdbRecAttr
, который возвращен этим методом.NdbRecAttr
, чтобы хранить значение признака или
NULL
, указывающий, что ошибка произошла.
2.3.21.12. NdbEventOperation::getState()
State getState
(
void
)
State
. См.
раздел 2.3.21.20.
2.3.21.13. NdbEventOperation::getValue()
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()
getEventType2()
, чтобы
определить тип события. Посмотрите
раздел 2.3.6.23.
int hasError
(
void
) const
2.3.21.15. NdbEventOperation::isConsistent()
getEventType2()
, чтобы определить, имеет ли
событие тип TE_INCONSISTENT
. См.
раздел 2.3.6.23.
bool isConsistent
(
void
) const
false
, иначе
true
.
2.3.21.16. NdbEventOperation::isEmptyEpoch()
bool isEmptyEpoch
(
void
)
true
, иначе
false
.
2.3.21.17. NdbEventOperation::isErrorEpoch()
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()
false
.
void mergeEvents
(
bool
flag
)
flag
.
2.3.21.20. NdbEventOperation::State
Имя
Описание 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()
.Имя
Описание
deleteTuple()
Удаляет кортеж из таблицы
getIndex()
Получает индекс, использованный операцией
readTuple()
Читает кортеж от таблицы
updateTuple()
Обновляет существующий кортеж в таблице
NdbIndexOperation
не определяет собственных публичных типов.
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
.Имя
Описание
end_of_bound()
Отмечает конец привязки
get_range_no()
Получает число диапазона для текущей строки
getDescending()
Проверка, сортирован ли текущий просмотр
getSorted()
Проверка, сортирован ли текущий просмотр
readTuples()
Читает кортежи, используя индекс
reset_bounds()
Сброс границ, помещает в очередь отправки операцию
setBound()
Определяет привязанный ключ индекса для просмотра диапазона
NdbIndexScanOperation
определяет один публичный тип
BoundType
.IndexBound
для использования с операционным использованием
NdbRecord
.
2.3.23.1. NdbIndexScanOperation::BoundType
Значение
Числовое значение
Описание 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
)
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
, чтобы определить максимум автоматически.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
.<= 2 &&
b <= 3
не только просматривает индекс до
(a=2, b=3)
, но также вернет
(a=1, b=4)
.BoundEQ
вместо эквивалентной пары
BoundLE
и BoundGE
.
Это особенно верно, когда ключ разделения таблицы префикс ключа индекса.NULL
считается меньше, чем кто-либо
не-NULL
и равный другому
NULL
. Чтобы выполнить сравнения с
NULL
, примените
setBound()
с пустым указателем (0
).NULL
также и выполнение просмотра индекса с пустым связанным набором возвращает
все кортежи из таблицы.
int setBound
(
const char*
name
,
int type
,
const void* value
)
int setBound
(
Uint32
id
,
int type
,
const void* value
)
name
или
id
признака, на котором должна быть установлена граница.type
см.
раздел 2.3.23.1.value
(0
= NULL
).
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 параметрами этого метода.0
при успехе,
-1
при неудаче.
2.3.24. Класс NdbInterpretedCode
NdbInterpretedCode
, который может использоваться, чтобы подготовить и выполнить
программу NDB API.NdbInterpretedCode
представляет интерпретируемую программу для использования в операциях,
созданных, используя
NdbRecord
,
или с просмотрами, созданными, используя старый API. Класс
NdbScanFilter
может также использоваться,
чтобы произвести интерпретируемую программу NDB, используя этот класс.NdbScanFilter
API более стабильный API для определения
просмотра и фильтрации программ.NdbInterpretedCode
,
вызовите конструктор, произвольно поставляя таблица для программы и буфер для
хранения программы. Если никакой таблица не поставляется, то только
инструкции, которые не получают доступ к признакам таблицы, могут
использоваться. Начиная с NDB 8.0.18, экземпляр
Ndbrecord
может использоваться с этой целью вместо
Table
.NdbInterpretedCode
приложена к той операции.NdbInterpretedCode
,
можно добавить инструкции и этикетки к нему, вызвав соответствующие методы,
как описано позже в этой секции. Когда программа закончится, завершите ее,
вызвав метод finalise()
, который закрывает любые
остающиеся внутренние отделения и вызываемые подпрограммы.NdbRecord
, передайте его во время
определения операции, используя
OperationOptions
или
ScanOptions
. Когда программа больше не требуется, объект
NdbInterpretedCode
может быть удален.Имя
Описание
NdbInterpretedCode()
Конструктор класса
add_reg()
Добавьте два значения регистра и сохраните результат в третьем регистре
add_val()
Добавьте значение к значениям столбца таблицы
branch_col_and_mask_eq_mask()
Пройти, если значение столбца AND
битовая маска равно битовой маске
branch_col_and_mask_eq_zero()
Пройти, если значение столбца AND
битовая маска равно 0
branch_col_and_mask_ne_mask()
Пройти, если значение столбца AND
битовая маска не равно битовой маске
branch_col_and_mask_ne_zero()
Пройти, если значение столбца AND
битовая маска не равно 0
branch_col_eq()
Пройти, если значение столбца равно другому
branch_col_eq_null()
Пройти, если значение столбца NULL
branch_col_ge()
Пройти, если значение столбца больше чем или равно другому
branch_col_gt()
Пройти, если значение столбца больше чем другой
branch_col_le()
Пройти, если значение столбца меньше чем или равно другому
branch_col_like()
Пройти, если значение столбца соответствует образцу
branch_col_lt()
Пройти, если значение столбца меньше чем другой
branch_col_ne()
Пройти, если значение столбца не равно другому
branch_col_ne_null()
Пройти, если значение столбца не NULL
branch_col_notlike()
Пройти, если значение столбца не соответствует образцу
branch_eq()
Пройти, если одно значение регистра равно другому
branch_eq_null()
Пройти, если значение регистра NULL
branch_ge()
Пройти, если одно значение регистра больше чем или равно другому
branch_gt()
Пройти, если одно значение регистра больше другого
branch_label()
Переход на метку
branch_le()
Пройти, если одно значение регистра меньше чем или равно другому
branch_lt()
Пройти, если одно значение регистра меньше другого
branch_ne()
Пройти, если одно значение регистра не равно другому
branch_ne_null()
Пройти, если значение регистра не NULL
call_sub()
Вызовите подпрограмму
copy()
Сделайте глубокую копию объекта
NdbInterpretedCode
def_label()
Создайте этикетку для использования в
рамках интерпретируемой программы
def_sub()
Определите подпрограмму
finalise()
Заканчивает интерпретируемую программу и
готовит ее к использованию
getNdbError()
Получает последнюю ошибку, связанную с этим объектом
NdbInterpretedCode
getTable()
Получает таблицу, на которой определяется программа
getWordsUsed()
Получает количество слов, используемых в буфере
interpret_exit_last_row()
Возвратите строку как часть результата и не проверяйте больше
строки в этом фрагменте
interpret_exit_nok()
Не возвращайте строку как часть результата
interpret_exit_ok()
Возвратите строку как часть результата
load_const_null()
Загрузить значение NULL
в регистр
load_const_u16()
Загрузите 16-битное числовое значение в регистр
load_const_u32()
Загрузите 32-битное числовое значение в регистр
load_const_u64()
Загрузите 64-битное числовое значение в регистр
read_attr()
Прочитайте значение столбца таблицы в регистр
ret_sub()
Возвратитесь из подпрограммы
sub_reg()
Вычтите два значения регистра и сохраните
результат в третьем регистре
sub_val()
Вычтите значение из значения столбца таблицы
write_attr()
Напишите значение регистра в столбец таблицы
2.3.24.1. Применение NdbInterpretedCode
NdbInterpretedCode
,
включая использование ресурсов.
2.3.24.1.1. Методы NdbInterpretedCode для загрузки значений в регистры
NdbInterpretedCode
. Пространство, требуемое
каждым из этих методов, показывают в следующей таблице:Метод
Буфер (слов)
Сообщение запроса (слов)
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
, для которого их вызывают.Метод
Буфер (слова)
Сообщение запроса (слова)
read_attr()
1
1
write_attr()
1
1
2.3.24.1.3. Методы арифметики регистров NdbInterpretedCode
NdbInterpretedCode
предоставляет два метода для выполнения
арифметических операций в регистрах. Используя
add_reg()
,
можно загрузить сумму двух регистров в другой регистр,
sub_reg()
позволяет загрузить разность двух регистров в другой регистр.Метод
Буфер (слова)
Сообщение запроса (слова)
add_reg()
1
1
sub_reg()
1
1
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
Метод
Буфер (слова)
Сообщение запроса (слова)
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
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
представляет длину постоянной величины:Метод
Буфер (слова)
Сообщение запроса (слова)
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(
это количество целых 8-байтовых слов,
требуемых, чтобы хранить постоянную величину, которая будет сравнена.L
/8)
2.3.24.1.7. Основанные на образце операции ветвления NdbInterpretedCode
NdbInterpretedCode
предоставляет два метода, которые могут
использоваться, чтобы ветвиться на основе сравнения между колонкой,
содержащей символьные данные (то есть,
a
CHAR
,
VARCHAR
,
BINARY
или
VARBINARY
)
и образцом регулярного выражения.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
представляет длину постоянной величины:Метод
Буфер (слова)
Сообщение запроса (слова)
branch_col_like()
2
2 + CEIL(
L
/ 8)
branch_col_notlike()
2
2 +
CEIL(
L
/8)
CEIL(
это количество целых 8-байтовых слов,
требуемых, чтобы хранить постоянную величину, которая будет сравнена.L
/8)
2.3.24.1.8. Операции битового сравнения NdbInterpretedCode
AND
между значением
столбца BIT
и образцом битовой маски.
NdbInterpretedCode
создан. Значение маски должно быть того же
самого размера, как сравниваемый столбец. BIT
передаются в и из API NDB как 32-битные слова с битами, приведенными в
порядок от младшего значащего бита до старшего значащего бита.
На x86 это первый байт (байт 0), на SPARC и PPC, это последний байт.
2.3.24.1.9. Методы обработки результата NdbInterpretedCode
L
представляет длину постоянной величины:Метод
Буфер (слова)
Сообщение запроса (слова)
interpret_exit_ok()
1
1
interpret_exit_nok()
1
1
interpret_exit_last_row()
1
1
2.3.24.1.10. Удобные методы NdbInterpretedCode
NdbInterpretedCode
, для которого вызван метод.L
представляет длину постоянной величины:Метод
Буфер (слова)
Сообщение запроса (слова)
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()
.
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
)
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()
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.aValue
:
int add_val
(
Uint32
attrId
,
Uint32 aValue
)
aValue
:
int add_val
(
Uint32
attrId
,
Uint64 aValue
)
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()
int branch_col_eq
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 Label
)
int branch_col_eq
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).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
)
NULL
.0
при успехе,
-1
при ошибке.
2.3.24.11. NdbInterpretedCode::branch_col_ge()
int branch_col_ge
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 label
)
int branch_col_ge
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).val
.label
(ранее определенная с использованием
def_label()
).AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.label
:
Этикетка для перехода.0
при успехе,
-1
при ошибке.2.3.24.12.
NdbInterpretedCode::branch_col_gt()
int branch_col_ge
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 label
)
int branch_col_ge
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).val
.Label
(ранее определенная
с использованием def_label()
).AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.label
:
Этикетка для перехода.0
при успехе,
-1
при ошибке.2.3.24.13.
NdbInterpretedCode::branch_col_le()
int branch_col_le
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 Label
)
int branch_col_ge
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).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
.0
при успехе,
-1
при неудаче
2.3.24.15. NdbInterpretedCode::branch_col_lt()
int branch_col_lt
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 Label
)
int branch_col_lt
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).val
.Label
(ранее определенная с использованием
def_label()
).branch_col_lt()
берет следующие три параметра:AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.label
:
Этикетка для перехода.0
при успехе,
-1
при неудаче.
2.3.24.16. NdbInterpretedCode::branch_col_ne()
int branch_col_ne
(
const void*
val
,
Uint32 len
,
Uint32 attrId
,
Uint32 Label
)
int branch_col_ne
(
Uint32
attrId1
,
Uint32 attrId2
,
Uint32 label
)
val
).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
)
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
.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()
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
)
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()
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
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 включительно.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()
int load_const_u16
(
Uint32
RegDest
,
Uint32 Constant
)
RegDest
:
Регистр, в который должно быть загружено значение.Constant
значение, которое будет загружено.0
при успехе,
-1
при ошибке.
2.3.24.41. NdbInterpretedCode::load_const_u32()
int load_const_u32
(
Uint32
RegDest
,
Uint32 Constant
)
RegDest
:
Регистр, в который должно быть загружено значение.Constant
значение, которое будет загружено.0
при успехе,
-1
при ошибке.
2.3.24.42. NdbInterpretedCode::load_const_u64()
int load_const_u64
(
Uint32
RegDest
,
Uint64 Constant
)
RegDest
:
Регистр, в который должно быть загружено значение.Constant
значение, которое будет загружено.0
при успехе,
-1
при ошибке.
2.3.24.43. NdbInterpretedCode::read_attr()
read_attr()
используется, чтобы прочитать значение столбца таблицы в регистр программы.
Столбец может быть определен при помощи признака ID или как указатель на
объект Column
.
int read_attr
(
Uint32
RegDest
,
Uint32 attrId
)
Column
:
int read_attr
(
Uint32
RegDest
,
const NdbDictionary::Column* column
)
RegDest
).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()
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
.
aValue
:
int sub_val
(
Uint32
attrId
,
Uint32 aValue
)
aValue
:
int sub_val
(
Uint32
attrId
,
Uint64 aValue
)
0
при успехе,
-1
при ошибке.
2.3.24.47. NdbInterpretedCode::write_attr()
Column
.
int read_attr
(
Uint32
attrId
,
Uint32 RegSource
)
Column
:
int read_attr
(
const NdbDictionary::Column*
column
,
Uint32 RegSource
)
attrId
).column
,
ссылающийся на столбец таблицы.RegSource
).0
при успехе,
-1
при ошибке.2.3.25. Класс NdbOperation
NdbOperation
.
NdbIndexOperation
,
NdbScanOperation
.NdbOperation
представляет
универсальную операцию с данными. Его подклассы
представляют более определенные типы операций. Посмотрите
раздел 2.3.25.18
для списка операционных типов и их соответствующих субклассов
NdbOperation
.Имя
Описание
deleteTuple()
Удаляет кортеж из таблицы
equal()
Определяет условие поиска, используя равенство
getBlobHandle()
Используется, чтобы получить доступ к признакам blob
getLockHandle()
Получает обработчик блокировки для операции
getLockMode()
Получает способ блокировки операции
getNdbError()
Получает последнюю ошибку
getNdbErrorLine()
Получает номер метода, где последняя ошибка произошла
getTableName()
Получает название таблицы, используемой для этой операции
getTable()
Получает объект таблицы для этой операции
getNdbTransaction()
Получает объект
NdbTransaction
для этой операции
getType()
Получает тип операции
getValue()
Ассигнует значение атрибута для более позднего доступа
insertTuple()
Добавляет новый кортеж к таблице
readTuple()
Читает кортеж от таблицы
setValue()
Определяет признак, чтобы установить или обновить
updateTuple()
Обновляет существующий кортеж в таблице
writeTuple()
Вставляет или обновляет кортеж
NdbOperation
, необходимо использовать
NdbTransaction::getNdbOperation()
.NdbOperation
определяет три публичных типа, показанные в следующей таблице:Имя
Описание
AbortOption()
Определяет, вызывает ли неудавшаяся операция неудачу транзакции
LockMode()
Тип блокировки, используемой, выполняя операцию чтения
Type()
Операционные типы доступа
2.3.25.1. NdbOperation::AbortOption
execute()
, см.
раздел 2.3.30.6.Имя
Описание AbortOnError
Неудавшаяся операция заставляет транзакцию прерываться. AO_IgnoreOnError
Проигнорированы неудавшиеся операции,
транзакция продолжает выполняться. DefaultAbortOption
Значение AbortOption
установлено согласно операционному типу:
AO_IgnoreOnError
.
AbortOnError
.
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.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
)
name
признака (последовательность).id
признака
unsigned 32-bit integer).value
для проверки.
Это значение может быть любым из следующих 5 типов:-1
в случае ошибки.
2.3.25.4. NdbOperation::getBlobHandle()
getValue()
или
setValue()
для признаков blob.
Это создает обработчик blob (объект
NdbBlob
).
Второй вызов с тем же самым аргументом возвращает ранее созданный обработчик,
связанный с операцией и сохраняется автоматически.
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
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()
NdbRecAttr
, который позже используется,
чтобы получить значение атрибута. Это может быть сделано при помощи одного из
многих методов
NdbRecAttr
, точный метод, который будет
использоваться зависит от типа данных признака. Это включает общий метод
NdbRecAttr::aRef()
, который получает
данные как char*
, независимо от фактического
типа. Однако, это не безопасно с точки зрения типов и требует внимания.NdbRecAttr
, возвращенный этим методом, не
удобочитаемый или пригодный для печатания перед запросом
NdbTransaction::execute()
.NdbRecAttr
имеет состояние UNDEFINED
.
Это может быть проверено при помощи
NdbRecAttr::isNULL()
, который в такой
ситуации вернет -1
.
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
в случае ошибки.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
Имя
Описание 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()
, которые берут определенный тип в
качестве входа (значение вместо того, чтобы передать указатель).
Обязанность прикладного программиста использовать правильные типы.char*
может содержать любой тип данных или любой
тип множества. Если длина не обеспечивается, или если она установлена в ноль,
то API предполагает, что указатель правилен и не проверяет его.NULL
,
используйте следующую конструкцию:
setValue("ATTR_NAME", (char*)NULL);
insertTuple()
, NDB API
автоматически обнаруживает, что он, как предполагается, использует
equal()
.insertTuple()
, применять
setValue()
на ключевых признаках перед другими признаками.
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
)
name
признака (string).id
признака
(unsigned 32-bit integer).value
это
значение, в которое должен быть установлен признак, его тип может быть любым
из следующих 7 типов:const char*
)-1
при ошибке.2.3.25.18. NdbOperation::Type
Type
используется, чтобы описать операционный тип доступа. Каждый тип доступа
поддерживается
NdbOperation
или один из его подклассов, как
показано в следующей таблице:Имя
Описание
Применимый класс 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
)
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();
NdbRecAttr
создается с его значением
только когда вызван
NdbTransaction::execute()
.
До этого значение не определена. Используйте
NdbRecAttr::isNULL()
, чтобы
проверить, определяется ли значение. Это означает, что у объекта
NdbRecAttr
есть действительная информация только между вызовами
NdbTransaction::execute()
и
Ndb::closeTransaction()
.
Значение NULL
указывает
-1
до вызова
NdbTransaction::execute()
.NdbRecAttr
имеет много методов для получения
значений различных простых типов непосредственно от экземпляра этого класса.
NdbRecAttr::aRef()
, но
необходимо знать, что это небезопасно с точки зрения
типов и требует аккуратности.Имя
Описание
~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
2.3.26.6. NdbRecAttr::float_value()
Float
,
сохраненное в объекте
NdbRecAttr
и возвращает его как float.
float float_value
(
void
) const
2.3.26.7. NdbRecAttr::get_size_in_bytes()
Uint32 get_size_in_bytes
(
void
) const
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
2.3.26.11. NdbRecAttr::int32_value()
Int
,
сохраненное в объекте
NdbRecAttr
и возвращает как
32-bit signed integer.
int32 int32_value
(
void
) const
2.3.26.12. NdbRecAttr::int64_value()
Bigint
,
сохраненное в объекте
NdbRecAttr
и возвращает как 64-bit signed integer.
int64 int64_value
(
void
) const
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
2.3.26.15. NdbRecAttr::short_value()
Smallint
,
сохраненное в объекте
NdbRecAttr
и возвращает как 16-bit signed integer (short).
short short_value
(
void
) const
2.3.26.16. NdbRecAttr::u_8_value()
Smallunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 8-bit unsigned integer.
Uint8 u_8_value
(
void
) const
2.3.26.17. NdbRecAttr::u_32_value()
Unsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 32-bit unsigned integer.
Uint32 u_32_value
(
void
) const
2.3.26.18.
NdbRecAttr::u_64_value()
Bigunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 64-bit unsigned integer.
Uint64 u_64_value
(
void
) const
2.3.26.19. NdbRecAttr::u_char_value()
Char
,
сохраненное в объекте
NdbRecAttr
и возвращает как unsigned char
.
Uint8 u_char_value
(
void
) const
char
.2.3.26.20.
NdbRecAttr::u_medium_value()
Mediumunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 32-bit unsigned integer.
Uint32 u_medium_value
(
void
) const
2.3.26.21. NdbRecAttr::u_short_value()
Smallunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 16-bit (short) unsigned integer.
Uint16 u_short_value
(
void
) const
2.3.27. Интерфейс NdbRecord
NdbRecord
это интерфейс, который
предоставляет отображение полной или частичной записи, сохраненной в
NDB
. В последнем случае это может использоваться
вместе с битовым массивом, чтобы помочь в доступе.NdbRecord
не имеет никаких собственных
методов API, скорее это действует как обработчик, который может быть передан
между различными вызовами метода во многих различных видах операций, включая
следующие операционные типы: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
обеспечивает альтернативное средство определения фильтров для
операций по просмотру.BIT
(Bug #24503).NdbScanFilter
, вероятно, изменятся
далее в будущих выпусках.Имя
Описание
NdbScanFilter()
Метод конструктора
~NdbScanFilter()
Метод деструктора
begin()
Начинает комплекс (набор условий)
cmp()
Сравнивает значение столбца с произвольным значением
end()
Заканчивает комплекс
eq()
Тест на равенство
ge()
Тест на большее или равное условие
getNdbError()
Обеспечивает доступ к информации об ошибке
getNdbOperation()
Получает связанный
NdbOperation
gt()
Тесты на условие больше чем
isfalse()
Определяет термин в комплексе как
FALSE
isnotnull()
Тест, не является ли значение столбца
NULL
isnull()
Тест, является ли значение столбца
NULL
istrue()
Определяет термин в комплексе как
TRUE
le()
Тест на меньше или равно
lt()
Тест на меньше
ne()
Тест на неравенство
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()
.Имя
Описание
Тип столбца в сравнении 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
битовая маска равно 0BIT
COL_AND_MASK_NE_ZERO
Значение столбца
AND
битовая маска не равно 0BIT
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
операторы это
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()
NdbScanFilter
.
NdbScanFilter
. См.
здесь.
int cmp
(
BinaryCondition
condition
,
int columnId
,
const void* value
,
Uint32 length
= 0
)
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
%
и _
:Метасимвол
Описание %
Ноль или больше знаков _
Точно один символ
\
)
как символ ESC. Чтобы соответствовать литералу
\, используйте \\
.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 второй колонки.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
)
ColId
)
колонки, значение которой должно быть проверено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
)
0
, если столбец не
NULL
.2.3.28.9.
NdbScanFilter::isnull()
NULL
.
int isnull
(
int
ColId
)
0
, если столбец
NULL
.
2.3.28.10. NdbScanFilter::istrue()
TRUE
.
int istrue
(
void
)
0
при успехе,
-1
при неудаче.2.3.28.11. NdbScanFilter::ge()
int ge
(
int
ColId
,
Uint32 value
)
int ge
(
int ColId
,
Uint64 value
)
eq()
,
lt()
,
le()
и
другим методам типа
NdbScanFilter
,
этот метод берет два параметра:ColId
)
колонки, значение которой должно быть проверено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.Значение
Описание 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()
int gt
(
int
ColId
,
Uint32 value
)
int gt
(
int ColId
,
Uint64 value
)
ColId
)
колонки, значение которой должно быть проверено0
при успехе,
-1
при неудаче.2.3.28.16. NdbScanFilter::le()
int le
(
int
ColId
,
Uint32 value
)
int le
(
int ColId
,
Uint64 value
)
ColId
)
колонки, значение которой должно быть проверено0
при успехе,
-1
при неудаче.2.3.28.17. NdbScanFilter::lt()
int lt
(
int
ColId
,
Uint32 value
)
int lt
(
int ColId
,
Uint64 value
)
ColId
)
колонки, значение которой должно быть проверено0
при успехе,
-1
при неудаче.2.3.28.18. NdbScanFilter::ne()
int ne
(
int
ColId
,
Uint32 value
)
int ne
(
int ColId
,
Uint64 value
)
ColId
)
колонки, значение которой должно быть проверено0
при успехе,
-1
при неудаче.2.3.29. Класс NdbScanOperation
NdbScanOperation
и его члены класса.
NdbOperation
.
NdbIndexScanOperation
.NdbScanOperation
представляет операцию по просмотру, используемую в транзакции.
Этот класс наследует
NdbOperation
.Имя
Описание
close()
Закрывает просмотр
deleteCurrentTuple()
Удаляет текущий кортеж
lockCurrentTuple()
Блокирует текущий кортеж
nextResult()
Получает следующий кортеж
getNdbTransaction()
Получает объект
NdbTransaction
для этого просмотра
getPruned()
Используемый, чтобы узнать, сокращен ли этот
просмотр к единственному разделению
readTuples()
Читает кортежи
restart()
Перезапускает просмотр
updateCurrentTuple()
Обновляет текущий кортеж
NdbScanOperation
, необходимо использовать
метод
NdbTransaction::getNdbScanOperation()
.ScanFlag
.
2.3.29.1. NdbScanOperation::close()
void close
(
bool
forceSend
= false,
bool releaseOp
= false
)
forceSend
по умолчанию
false
, вызывает
close()
с этим параметром =
true
, чтобы вынудить
транзакции быть посланными.releaseOp
по умолчанию
false
, установите это в
true
, чтобы выпустить операцию.
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
)
NdbRecord
, этот метод берет параметры, перечисленные здесь:takeOverTrans
), которая должна выполнить блокировку, используя
NdbRecord
с просмотрами, этот параметр не дополнительный.NdbRecord
, ссылающийся на просмотр. Это значение
record
требуется, даже если никакие записи не читаются.
row
из которой можно читать. Установите это в NULL
,
если чтение не планируется.mask
. Если это присутствует, то просматриваются только колонки, для которых
установлен соответствующий бит в маске.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный контроль
операционных определений. Структура
OperationOptions
передается с флагами, указывающими, какие операционные варианты определения
присутствуют. Не все операционные типы поддерживают все операционные
варианты. Опции, поддержанные для каждого типа операции,
показываются в следующей таблице:
Операционный тип (метод)
Поддержанные флаги
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()
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
, этот метод берет эти параметры, как
описано в следующем списке: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()
,
обновляются с значениями от просмотренного кортежа.nextResult()
выполняется после конца файла,
NDB
вернет код ошибки 4210
(Ndb sent more info than length specified)
и дополнительный операционный объект освобожден, возвратив его к
неработающему списку для правильного узла TC.
int nextResult
(
bool
fetchAllowed
= true,
bool forceSend
= false
)
int nextResult
(
const char*&
outRow
,
bool fetchAllowed
= true,
bool forceSend
= false
)
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.nextResult()
устанавливает указатель на следующую строку в
outRow
(если возвращает 0).
Этот указатель действителен (только) до следующего вызова
nextResult()
, когда
fetchAllowed
= true.
Объект NdbRecord
, определяющий формат строки, должен быть определен заранее,
используя
NdbTransaction::scanTable()
(или
NdbTransaction::scanIndex()
.fetchAllowed
предписывает NDB
обработать любые записи,
которые это уже имеет в его кэшах. См. описание для этого
параметра в предыдущем подразделе.forceSend
=
true
указывает, которые транзакции немедленно
посылают, как описано в предыдущем подразделе
раздела 1.3.4.-1
:
Указывает, что ошибка произошла.0
: Другой кортеж был получен.1
:
Больше нет кортежей, чтобы просмотреть.2
: Больше нет кэшированных записей
(вызовите nextResult(true)
, чтобы получить еще).
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
предписывает
определить максимум автоматически.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.Значение
Описание SF_TupScan
Просмотр в порядке TUP (то есть, в порядке строк в памяти).
Относится только к сканированию таблицы. SF_DiskScan
Просмотр в дисковом порядке (порядок строк на диске).
Относится только к сканированию таблицы. SF_OrderBy
SF_Descending
.SF_OrderBy
и
SF_OrderByFull
.SF_OrderBy
или
SF_OrderByFull
, результаты
каждого фрагмента индекса в определенном порядке (возрастание или убывание),
но результаты различных фрагментов могут быть чередованы.SF_OrderBy
или
SF_OrderByFull
,
некоторые дополнительные ограничения наложены внутренне,
они перечисляются здесь: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
)
NdbRecord
,
этот метод берет следующие параметры, как описано в следующем списке:takeOverTrans
).record
(объект
NdbRecord
), ссылка на колонку используется для просмотра.row
.
Если никакие признаки не должны быть прочитаны, установите это в
NULL
.mask
дополнительный. Если это присутствует, то читаются только колонки, для
которых установлен соответствующий бит в маске.
NdbOperation
или NULL
.2.3.30. Класс NdbTransaction
NdbTransaction
и его публичные члены.NdbTransaction
, который принадлежит объекту
Ndb
и создается, используя
Ndb::startTransaction()
.
Транзакция состоит из списка операций, представленных классом
NdbOperation
или одним из его подклассов:
NdbScanOperation
,
NdbIndexOperation
или
NdbIndexScanOperation
.
Каждый операционный доступ обрабатывает точно одну таблицу.NdbTransaction
это используется следующим образом:getNdbOperation()
getNdbScanOperation()
getNdbIndexOperation()
getNdbIndexScanOperation()
NdbTransaction
,
в этом случае они выполняются параллельно. Когда все операции определяются,
метод
execute()
посылает их в ядро
NDB
на выполнение.execute()
возвращается когда ядро
NDB
закончило выполнение всех
ранее определенных операций.execute()
.execute()
работает в одном из этих трех режимов:NdbTransaction::NoCommit
:
Выполняет операции, не передавая их.NdbTransaction::Commit
: Выполняет любую
остающуюся операцию и затем передает завершенную транзакцию.NdbTransaction::Rollback
:
Отменяет всю транзакцию.execute()
также оборудован дополнительным параметром обработки ошибок,
который обеспечивает эти две альтернативы:NdbOperation::AbortOnError
:
Любая ошибка заставляет транзакцию быть прерванной.
Это поведение по умолчанию.NdbOperation::AO_IgnoreError
:
Транзакция продолжает выполняться, даже если одна или больше операций,
определенных для той транзакции, терпит неудачу.NdbTransaction::AbortOnError
и
NdbTransaction::AO_IgnoreError
.Имя
Описание
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 публичных типа:Имя
Описание
CommitStatusType()
Описывает статус передачи транзакции
ExecType()
Определяет, должна ли транзакция быть передана или отменена
2.3.30.1. NdbTransaction::close()
Ndb::closeTransaction()
.
void close
(
void
)
2.3.30.2. NdbTransaction::commitStatus()
CommitStatusType commitStatus
(
void
)
CommitStatusType
, см.
раздел 2.3.30.3.
2.3.30.3. NdbTransaction::CommitStatusType
Имя
Описание 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.Имя
Описание 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
: Не принудительно, не
определять адаптивным алгоритмом.0
при успехе,
-1
при неудаче.
То, что транзакция не прерывалась, не обязательно означает, что каждая
операция была успешна, необходимо проверить каждую операцию
индивидуально на ошибки.-1
для некоторых ошибок, даже когда сама
транзакция не была прервана. Начиная с MySQL 5.1.16, этот метод сообщает о
неудаче если и только если
транзакция была прервана. Это изменение было внесено из-за того, что было
возможно построить случаи, где не было никакого способа определить, была ли
транзакция на самом деле прервана. Однако, информация об ошибке транзакции
все еще пытается в таких случаях отразить фактический код ошибки и категорию.
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()
int getGCI
(
void
)
-1
, если ни один недоступен.execute()
с ExecType::Commit
.
2.3.30.9. NdbTransaction::getMaxPendingBlobReadBytes()
BLOB
. Когда объем данных
volume of BLOB
,
которые будут прочитаны в данной транзакции, превышает этот размер, все
операции чтения в транзакции выполняются.
Uint32 getMaxPendingBlobReadBytes
(
void
) const
2.3.30.10. NdbTransaction::getMaxPendingBlobWriteBytes()
BLOB
. Когда объем данных
BLOB
, которые будут написаны в
данной транзакции, превышает это значение, все операции
записи в транзакции выполняются.
Uint32 getMaxPendingBlobWriteBytes
(
void
) const
2.3.30.11. NdbTransaction::getNdbError()
NdbError
).
const NdbError& getNdbError
(
void
) const
NdbError
.
2.3.30.12. NdbTransaction::getNdbErrorLine()
int getNdbErrorLine
(
void
)
2.3.30.13. NdbTransaction::getNdbErrorOperation()
NdbOperation::getNdbError()
объекта
NdbOperation
, возвращенного
getNdbErrorOperation()
.
NdbOperation* getNdbErrorOperation
(
void
)
NdbOperation
.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()
Uint64 getTransactionId
(
void
)
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
передается с флагами, указывающими, какие
операционные варианты определения присутствуют. Не все операционные типы
поддерживают все операционные варианты, опции, поддержанные для каждого типа
операции, показываются в следующей таблице:
Операционный тип (метод)
Поддержанные флаги
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()
NdbRecord
операции чтения первичного ключа это нельзя вызвать, пока связанная операция
чтения не была выполнена.
int releaseLockHandle
(
const NdbLockHandle*
lockHandle
)
NdbLockHandle
для освобождения.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
, принадлежащему этой связи.
Это сделано, приобретя объекты схемы тех же самых имен от связи и сравнив их
с объектами схемы, переданными к транзакции. Если они не
соответствуют, ошибка возвращена.
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
.Имя
Описание
getObjectId()
Получает ID объекта
getObjectStatus()
Получает статус объекта
getObjectVersion()
Получает версию объекта
Table
, Index
и Event
.Имя
Описание
FragmentType
Тип фрагментации, используемый объектом (таблица или индекс)
State
Состояние объекта (если применимо)
Status
Состояние объекта (если доступно)
Store
Хранится объект постоянно или временно
Type
Тип объекта (таблица, индекс или другой объект базы данных,
представленный Object
)
2.3.31.1. Object::FragmentType
Object
.FragAllMedium
. Для уникального хэш-индекса
умолчание взято из базовой таблицы и не может в настоящее время изменяться.
Имя
Описание FragUndefined
Тип фрагментации не определен или умолчание FragAllMedium
Два фрагмента на узел FragAllLarge
Четыре фрагмента на узел DistrKeyHash
Распределенный хэш-ключ DistrKeyLin
Распределенный линейный хэш-ключ UserDefined
Определено пользователем HashMapPartition
Разделение хэш-карты
2.3.31.2. Object::PartitionBalance
setPartitionBalance()
. Это также тип,
возвращенный
getPartitionBalance()
.Имя
Описание
PartitionBalance_ForRPByLDM
Используйте один фрагмент на LDM на узел
PartitionBalance_ForRAByLDM
Используйте один фрагмент на LDM на группу узлов
PartitionBalance_ForRPByNode
Используйте один фрагмент на узел
PartitionBalance_ForRAByNode
Используйте один фрагмент на группу узлов PartitionBalance_Specific
Используйте настройки, заданные
setPartitionBalance()
FragmentCountType
и мог взять одно из значений
FragmentCount_OnePerLDMPerNode
,
FragmentCount_OnePerLDMPerNodeGroup
,
FragmentCount_OnePerNode
,
FragmentCount_OnePerNodeGroup
или
FragmentCount_Specific
.
Эти значения соответствуют показанным в предыдущей
таблице в показанном порядке.2.3.31.3. Object::State
Object
.Имя
Описание StateUndefined
Неопределенный StateOffline
Офлайн, не применимый StateBuilding
Создается, не применимый (?) StateDropping
Переход в офлайн или удаление, не применимый StateOnline
Онлайн, применимый StateBackup
Онлайн, резервируется, применимый StateBroken
Поврежден, должен быть удален и воссоздан
2.3.31.4. Object::Status
Object
.Status
говорит, доступно ли это в ядре NDB
.Имя
Описание New
Объект существует только в памяти и еще не был создан в ядре
NDB
Changed
Объект был изменен в памяти и должен быть передан в ядро
NDB
для вступления в силу измененийRetrieved
Объект существует и был прочитан в оперативную память из ядра
NDB
Invalid
Объект был лишен законной силы и больше не должен использоваться Altered
Таблица была изменена в ядре NDB
,
но все еще доступна для использования
2.3.31.5. Object::Store
Object
.Имя
Описание StoreUndefined
Объект не определен StoreTemporary
Временное хранение, объект или данные будут удалены
при системном перезапуске StorePermanent
Объект или данные постоянные, это было сохранено на диск
2.3.31.6. Object::Type
Object
.Type
объекта
может быть один из нескольких различных видов индекса, триггера, табличного
пространства и так далее.Имя
Описание 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()
virtual int getObjectId
(
void
) const
2.3.31.8. Object::getObjectStatus()
virtual Status getObjectStatus
(
void
) const
Status
для
Object
.
2.3.31.9. Object::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.32. Структура OperationOptions
NdbOperation
.NdbRecord
первичному ключу и методам просмотра, определенным в классах
NdbTransaction
и
NdbScanOperation
.NdbTransaction::*Tuple()
(см. раздел 2.3.30) берут
дополнительный параметр sizeOfOptions
. Это дополнительно и предназначается, чтобы разрешить интерфейсному
внедрению оставаться обратно совместимым с не собранными повторно клиентами
старшего возраста, которые могут передать более старую версию структуры
OperationOptions
. Этот эффект достигается,
передавая sizeof(OperationOptions)
в этот параметр.optionsPresent
.
Только типы выбора, отмеченные в
optionsPresent
, имеют
разумные данные. Все данные копируются из структуры
OperationOptions
в операционное время определения. Если никакие варианты не требуются, то
NULL
может быть передан вместо этого.Имя
Тип
Описание 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.33. Структура PartitionSpec
PartitionSpec
.Ndb
.PartitionSpec
используется для описания разделения таблицы с точки зрения любого
из следующих критериев:NdbRecord
, содержащая значения ключа
распределения разделенной таблицы.PartitionSpec
имеет два признака,
SpecType
и Spec
,
которые являются структурой данных, соответствующей этому
SpecType
:
Перечисление
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
.
SpecType
=
PS_USER_DEFINED
.Атрибут
Тип
Описание partitionId
Uint32
Разделение ID для желаемой таблицы.
SpecType
=
PS_DISTR_KEY_PART_PTR
.Атрибут
Тип
Описание tableKeyParts
Key_part_ptr
Указатель на значения ключа распределения для таблицы,
имеющей родное разделение. xfrmbuf
void*
Указатель на временный буфер используется
для выполнения вычислений. xfrmbuflen
Uint32
Длина временного буфера.
SpecType
=
PS_DISTR_KEY_RECORD
.Атрибут
Тип
Описание 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
.Имя
Тип
Описание 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.35. Структура ScanOptions
NdbScanOperation
.
NdbRecord
-методам
scanTable()
и
scanIndex()
класса
NdbTransaction
. Каждый тип выбора отмечен как существующий, установив
соответствующий бит в поле optionsPresent
.
Только типы выбора, отмеченные в
optionsPresent
, обработаны.ScanOptions
в операционное время определения. Если никакие варианты не требуются, то
NULL
может быть передан как указатель
ScanOptions
.Имя
Тип
Описание 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.36. Структура SetValueSpec
NdbOperation
.NdbRecord
.Имя
Тип
Описание column
Column
Чтобы определить дополнительное значение, чтобы читать, вызывающий должен
обеспечить это, а также указатель (возможно
NULL
)
appStorage
.value
void*
Это должно указать на значение, которое будет установлено, или
NULL
, если признак должен быть установлен в
NULL
. Ззначение копируется, когда операция
определяется и не должно оставаться прежним во время выполнения.
SetValueSpec
.2.3.37. Класс Table
Table
,
который моделирует таблицу базы данных в API NDB.NdbDictionary
.Table
представляет таблицу в базе данных NDB Cluster. Этот класс расширяет класс
Object
,
который в свою очередь является внутренним классом для класса
NdbDictionary
.Table
,
чтобы изменить существующие таблицы, но эти изменения (за исключением
переименования) невидимы MySQL.Имя
Описание
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()
.
int aggregate
(
struct NdbError&
error
)
NdbError
.0
при успехе и -1
,
если таблица находится в непоследовательном статусе. В последнем случае
также установлен error
.2.3.37.3. Конструктор
Table
. Есть две версии конструктора,
одна для создания нового экземпляра и вторая для конструктора копии.
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
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
при успехе, любое другое значение при ошибке.
Ненулевое значение должно интерпретироваться как код ошибки для типа ошибки.
2.3.37.8. Table::getFragmentCount()
Uint32 getFragmentCount
(
void
) const
2.3.37.9. Table::getFragmentData()
const void* getFragmentData
(
void
) const
2.3.37.10. Table::getFragmentDataLen()
Uint32 getFragmentDataLen
(
void
) const
2.3.37.11. Table::getFragmentNodes()
Uint32 getFragmentNodes
(
Uint32
fragmentId
,
Uint32* nodeIdArrayPtr
,
Uint32 arraySize
) const
fragmentId
:
ID желаемого фрагмента.nodeIdArrayPtr
:
Указатель на множество ID узлов, содержащих этот фрагмент.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()
bool getHashMap
(
Uint32*
id
= 0,
Uint32* version
= 0
) const
2.3.37.16. Table::getKValue()
6
.
В будущем выпуске может стать выполнимо установить этот параметр
на другие значения.
int getKValue
(
void
) const
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
2.3.37.20. Table::getMaxRows()
Uint64 getMaxRows
(
void
) const
2.3.37.21. Table::getMinLoadFactor()
getMaxLoadFactor()
.
int getMinLoadFactor
(
void
) const
2.3.37.22. Table:getName()
const char* getName
(
void
) const
2.3.37.23.
Table::getNoOfColumns()
int getNoOfColumns
(
void
) const
2.3.37.24. Table::getNoOfPrimaryKeys()
int getNoOfPrimaryKeys
(
void
) const
2.3.37.25. Table::getObjectId()
virtual int getObjectId
(
void
) const
2.3.37.26.
Table::getObjectStatus()
Object::Status
.
virtual Object::Status getObjectStatus
(
void
) const
Status
.
См. раздел 2.3.31.4.2.3.37.27.
Table::getObjectType()
Object::Type getObjectType
(
void
) const
Type
. См.
раздел 2.3.31.6.
2.3.37.28. Table::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.37.29. Table::getPartitionBalance()
Object::PartitionBalance getPartitionBalance
(
void
) const
Object::PartitionBalance
.getFragmentCountType()
.
2.3.37.30. Table::getPartitionBalanceString()
const char* getPartitionBalanceString
(
void
) const
getFragmentCountTypeString()
.
2.3.37.31. Table::getPartitionId()
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
2.3.37.35.
Table::getRowChecksumIndicator()
bool getRowChecksumIndicator
(
void
) const
true
или false
.2.3.37.36.
Table::getRowGCIIndicator()
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()
int getTableId
(
void
) const
2.3.37.39.
Table::getTablespace()
const char* getTablespace
(
void
) const
bool getTablespace
(
Uint32*
id
= 0,
Uint32* version
= 0
) const
id
как указатель на 32-bit unsigned integer.version
как указатель на 32-bit unsigned integer.id
и
version
это
0
.getTablespace()
вызван без любых аргументов, это возвращает экземпляр объекта
Tablespace
.true
, если табличное пространство совпадает с
имеющим заданный ID и обозначенную версию, иначе это возвращает
false
.
2.3.37.40. Table::getTablespaceData()
const void* getTablespaceData
(
void
) const
2.3.37.41. Table::getTablespaceDataLen()
Uint32 getTablespaceDataLen
(
void
) const
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
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
при успехе.
Любое другое значение указывает на неудачу, в этом случае значение
это код ошибки, указывающее на тип ошибки.2.3.37.47.
Table::setFragmentCount()
void setFragmentCount
(
Uint32
count
)
count
количество фрагментов, которые будут использоваться для таблицы.2.3.37.48.
Table::setFragmentData()
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()
int setHashMap
(
const class HashMap &
)
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()
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()
void setObjectType
(
Object::Type
type
)
type
. Это должно быть одним из значений Type
, перечисленных в раздел 2.3.31.6
.
2.3.37.60. Table::setPartitionBalance()
void setPartitionBalance
(
Object::PartitionBalance
scheme
)
scheme
это схема балансирования разделения, которая будет использоваться для
таблицы. Это значение типа
PartitionBalance
.setFragmentCountType()
.2.3.37.61.
Table::setRangeListData()
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()
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
)
name
табличного пространства (последовательность).Tablespace
.2.3.37.67.
Table::setTablespaceData()
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
Имя
Описание
SingleUserModeLocked
Таблица блокирована (недоступна). SingleUserModeReadOnly
Таблица доступна в режиме только для чтения. SingleUserModeReadWrite
Таблица доступна в режиме чтения и записи.
2.3.37.70. Table::validate()
Table::aggregate()
, а также дополнительные проверки.
validate()
вызван автоматически, когда
таблица составлена или получена. Поэтому обычно не надо явно вызывать
aggregate()
или
validate()
.validate()
там могут все еще существовать ошибки, которые могут быть обнаружены только
ядром NDB
, когда таблица на
самом деле составлена.
int validate
(
struct NdbError&
error
)
NdbError
.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.Tablespace
недоступен приложениям API NDB,
написанным для этих старых выпусков.Имя
Описание
Tablespace()
Конструктор класса
~Tablespace()
Виртуальный метод деструктора
getAutoGrowSpecification()
Используемый, чтобы получить структуру
AutoGrowSpecification
,
связанную с табличным пространством
getDefaultLogfileGroup()
Получает имя группы файла журнала табличного
пространства по умолчанию
getDefaultLogfileGroupId()
Получает ID группы файла журнала табличного
пространства по умолчанию
getExtentSize()
Получает размер экстента табличного пространства
getName()
Получает название табличного пространства
getObjectId()
Получает идентификатор объекта экземпляра
Tablespace
getObjectStatus()
Используемый, чтобы получить
Object::Status
экземпляра
Tablespace
, для которого это вызывают
getObjectVersion()
Получает версию объекта Tablespace
,
для которого это вызвано
setAutoGrowSpecification()
Используемый, чтобы установить
особенности табличного пространства
setDefaultLogfileGroup()
Устанавливает группу файла журнала табличного
пространства по умолчанию
setExtentSize()
Устанавливает размер экстентов,
используемых табличным пространством
setName()
Определяет имя для табличного пространства
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.38.3. Tablespace::getDefaultLogfileGroup()
const char* getDefaultLogfileGroup
(
void
) const
2.3.38.4. Tablespace::getDefaultLogfileGroupId()
Uint32 getDefaultLogfileGroupId
(
void
) const
2.3.38.5. Tablespace::getExtentSize()
Uint32 getExtentSize
(
void
) const
2.3.38.6. Tablespace::getObjectId()
virtual int getObjectId
(
void
) const
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()
virtual int getObjectVersion
(
void
) const
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
)
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, который хранит данные, используемые для того,
чтобы отменить транзакции.undofile
недоступен приложениям API NDB, написанным для этих версий.Имя
Описание
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()
Uint32 getFileNo
(
void
) const
2.3.39.3. undofile::getLogfileGroup()
const char* getLogfileGroup
(
void
) const
2.3.39.4. undofile::getLogfileGroupId()
Uint32 getLogfileGroupId
(
void
) const
2.3.39.5. undofile::getNode()
Uint32 getNode
(
void
) const
2.3.39.6. undofile::getObjectId()
virtual int getObjectId
(
void
) const
2.3.39.7. undofile::getObjectStatus()
virtual Object::Status getObjectStatus
(
void
) const
Object::Status
.
2.3.39.8. undofile::getObjectVersion()
virtual int getObjectVersion
(
void
) const
2.3.39.9. undofile::getPath()
const char* getPath
(
void
) const
2.3.39.10. undofile::getSize()
Uint64 getSize
(
void
) const
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()
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
с их классификациями и вероятными причинами,
для которого они могли бы быть подняты.NdbError
, которая используется, чтобы
передать информацию об ошибке приложениям API NDB, см.
раздел 2.3.20.NDB
API, поскольку они подвержены изменениям со
временем. Вместо этого необходимо использовать
NdbError::Status
и классификация ошибок в вашем исходном коде или работать с выводом
perror
,
чтобы получить информацию об определенном коде ошибки.--ndb
error_code
2.4.1. Обработка ошибки 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()
.execute()
в рамках
NdbScanOperation::nextResult()
. Когда
NdbScanOperation::nextResult()
указывает на неудачу (то есть, если метод возвращает
-1
),
операционный объект должен быть проверен на ошибку.
NdbScanOperation
может также содержать ошибку, но только если
ошибка не определенная для операции.BLOB
также имеют неявный внутренний вызов execute()
и могут испытать операционные неудачи выполнения в этих пунктах. Следующие
методы NdbBlob
могут произвести неявный вызов execute()
,
это означает, что они также требуют проверки объекта
NdbTransaction
на ошибки через
NdbTransaction::getNdbError()
,
если они возвращают код ошибки:setNull()
truncate()
readData()
writeData()
NdbScanOperation::nextResult()
execute()
. Методы
NdbBlob
могут заставить другие определенные операции быть выполненными, когда эти
методы вызывают, однако, nextResult()
не делает этого.NdbTransaction::getNdbError()
нужно вызвать, чтобы определить первую ошибку, которая произошла.
Когда операции собраны в пакет и есть операции с
IgnoreError
в пакете, могут быть многократные
операции с ошибками в транзакции. Они могут быть найдены при помощи
NdbTransaction::getNextCompletedOperation()
,
чтобы итерировать по набору законченных операций, вызывая для каждой
NdbOperation::getNdbError()
.IgnoreError
установлена на любой операции в пакете, метод
NdbTransaction::execute()
указывает на успех даже там, где ошибки
на самом деле произошли, пока ни одна из этих ошибок не заставила транзакцию
быть прерванной. Чтобы определить, были ли какие-либо проигнорированные
ошибки, операционный ошибочный статус должен быть проверен, используя
NdbTransaction::getNdbError()
.
Только если это указывает на успех, вы можете быть
уверены, что никакие ошибки не произошли.
Если код ошибки возвращен этим методом, и операции были собраны в пакет, то
необходимо пройти по всем законченным операциям, чтобы найти все
операции с проигнорированными ошибками.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
...
}
}
NdbError
и типах информации, которая может быть получена из объектов
NdbError
см. раздел 2.3.20.2.4.2. Коды ошибок NDB: типы
storage/ndb/src/ndbapi/ndberror.cpp
.
(в предыдущих выпусках NDB Cluster этот файл был
ndberror.c
).error_status
таблицы
ndbinfo.error_messages
.2.4.2.1. Нет ошибки
2.4.2.2.
Ошибка приложения
2.4.2.3.
Никакие данные не найдены
2.4.2.4.
Ограничительное нарушение
2.4.2.5. Ошибка схемы
2.4.2.6.
Объект схемы уже существует
2.4.2.7.
Пользователь определил ошибку
2.4.2.8.
Недостаточно места
2.4.2.9.
Временная ошибка ресурса
2.4.2.10.
Ошибка восстановления узла
2.4.2.11.
Ошибки перегрузки
2.4.2.12. Тайм-аут кончился
2.4.2.13. Закрытие узла
2.4.2.14. Внутренняя временная ошибка
2.4.2.15. Неизвестная ошибка результата
2.4.2.16.
Внутренняя ошибка
2.4.2.17.
Функция не реализована
2.4.3. Коды ошибок NDB: общий листинг
NDB
,
упорядоченные по коду ошибки NDB
.
Каждый листинг также включает тип ошибки
NDB
, соответствующую ошибку MySQL Server и
и текст сообщения об ошибке.
2.4.4. Классификации ошибок NDB
/storage/ndb/src/ndbapi/ndberror.cpp
(NDB 7.6 и ранее: файл
ndberror.c
).Классификационный код
Статус ошибки
Описание 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
error_classification
таблицы
ndbinfo.error_messages
.2.5. Примеры NDB API
[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, использующий синхронные транзакции
ndb_examples
и таблицу
api_simple
(если эти объекты еще не существуют) с использованием MySQL C API с узлом
SQL и выполняет ряд операций по исходным данным (вставка, обновление,
чтение и выбор) на этой таблице, используя API NDB.
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,
использующий синхронные транзакции и много кластеров
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);
}
2.5.3. Пример NDB API: ошибки из-за неправильного
обращения и повторение транзакций
storage/ndb/ndbapi-examples/ndbapi_retries/ndbapi_retries.cpp
в дереве исходных текстов NDB Cluster.NdbTransaction::execute(NoCommit)
.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: основной пример просмотра
NdbScanFilter
и
NdbScanOperation
.
storage/ndb/ndbapi-examples/ndbapi_scan/ndbapi_scan.cpp
.Ndb
:
/*
Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301USA
*/
/*
* ndbapi_scan.cpp:
* Illustrates how to use the scan api in the NDBAPI.
* The example shows how to do scan, scan for update and scan for delete
* using NdbScanFilter and NdbScanOperation
*
* Classes and methods used in this example:
*
*Ndb_cluster_connection
* connect()
* wait_until_ready()
*
*Ndb
* init()
* getDictionary()
* startTransaction()
* closeTransaction()
*
*NdbTransaction
* getNdbScanOperation()
* execute()
*
*NdbScanOperation
* getValue()
* readTuples()
* nextResult()
* deleteCurrentTuple()
* updateCurrentTuple()
*
*const NdbDictionary::Dictionary
* getTable()
*
*const NdbDictionary::Table
* getColumn()
*
*const NdbDictionary::Column
* getLength()
*
*NdbOperation
* insertTuple()
* equal()
* setValue()
*
*NdbScanFilter
* begin()
* eq()
* end()
*
*/
#ifdef _WIN32
#include <winsock2.h>
#endif
#include <mysql.h>
#include <mysqld_error.h>
#include <NdbApi.hpp>
// Used for cout
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <config.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
/**
* Helper sleep function
*/
static void milliSleep(int milliseconds)
{
struct timeval sleeptime;
sleeptime.tv_sec = milliseconds / 1000;
sleeptime.tv_usec = (milliseconds - (sleeptime.tv_sec * 1000)) * 1000000;
select(0, 0, 0, 0, &sleeptime);
}
/**
* Helper debugging macros
*/
#define PRINT_ERROR(code,msg) \
std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \
<< ", code: " << code \
<< ", msg: " << msg << "." << std::endl
#define MYSQLERROR(mysql) { \
PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \
exit(-1); }
#define APIERROR(error) { \
PRINT_ERROR(error.code,error.message); \
exit(-1); }
struct Car
{
/**
* Note memset, so that entire char-fields are cleared
* as all 20 bytes are significant (as type is char)
*/
Car() {memset(this, 0, sizeof(* this));}
unsigned int reg_no;
char brand[20];
char color[20];
};
/**
* Function to drop table
*/
void drop_table(MYSQL &mysql)
{
if (mysql_query(&mysql, "DROP TABLE IF EXISTS api_scan"))
MYSQLERROR(mysql);
}
/**
* Function to create table
*/
void create_table(MYSQL &mysql)
{
while (mysql_query(&mysql, "CREATE TABLE" "api_scan"
"(REG_NO INT UNSIGNED NOT NULL," " BRAND CHAR(20) NOT NULL,"
" COLOR CHAR(20) NOT NULL," " PRIMARY KEY USING HASH (REG_NO))"
"ENGINE=NDB"))
{
if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR) MYSQLERROR(mysql);
std::cout << "NDB Cluster already has example table: api_scan. "
<< "Dropping it..." << std::endl;
drop_table(mysql);
}
}
int populate(Ndb * myNdb)
{
int i;
Car cars[15];
const NdbDictionary::Dictionary* myDict= myNdb->getDictionary();
const NdbDictionary::Table *myTable= myDict->getTable("api_scan");
if (myTable == NULL) APIERROR(myDict->getNdbError());
/**
* Five blue mercedes
*/
for (i = 0; i < 5; i++)
{
cars[i].reg_no = i;
sprintf(cars[i].brand, "Mercedes");
sprintf(cars[i].color, "Blue");
}
/**
* Five black bmw
*/
for (i = 5; i < 10; i++)
{
cars[i].reg_no = i;
sprintf(cars[i].brand, "BMW");
sprintf(cars[i].color, "Black");
}
/**
* Five pink toyotas
*/
for (i = 10; i < 15; i++)
{
cars[i].reg_no = i;
sprintf(cars[i].brand, "Toyota");
sprintf(cars[i].color, "Pink");
}
NdbTransaction* myTrans = myNdb->startTransaction();
if (myTrans == NULL) APIERROR(myNdb->getNdbError());
for (i = 0; i < 15; i++)
{
NdbOperation* myNdbOperation = myTrans->getNdbOperation(myTable);
if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError());
myNdbOperation->insertTuple();
myNdbOperation->equal("REG_NO", cars[i].reg_no);
myNdbOperation->setValue("BRAND", cars[i].brand);
myNdbOperation->setValue("COLOR", cars[i].color);
}
int check = myTrans->execute(NdbTransaction::Commit);
myTrans->close();
return check != -1;
}
int scan_delete(Ndb* myNdb, int column, const char * color)
{
// Scan all records exclusive and delete
// them one by one
intretryAttempt = 0;
const intretryMax = 10;
int deletedRows = 0;
int check;
NdbErrorerr;
NdbTransaction* myTrans;
NdbScanOperation* myScanOp;
const NdbDictionary::Dictionary* myDict= myNdb->getDictionary();
const NdbDictionary::Table *myTable= myDict->getTable("api_scan");
if (myTable == NULL) APIERROR(myDict->getNdbError());
/**
* Loop as long as :
*retryMax not reached
*failed operations due to TEMPORARY erros
*
* Exit loop;
*retyrMax reached
*Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation "
<< retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout <<err.message << std::endl;
return -1;
}
/**
* Get a scan operation.
*/
myScanOp = myTrans->getNdbScanOperation(myTable);
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define a result set for the scan.
*/
if (myScanOp->readTuples(NdbOperation::LM_Exclusive) != 0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Use NdbScanFilter to define a search critera
*/
NdbScanFilter filter(myScanOp);
if (filter.begin(NdbScanFilter::AND) < 0||
filter.cmp(NdbScanFilter::COND_EQ, column, color, 20) < 0 ||
filter.end() < 0)
{
std::cout <<myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan(NoCommit since we are only reading at this stage);
*/
if (myTrans->execute(NdbTransaction::NoCommit) != 0)
{
err = myTrans->getNdbError();
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << err.code << std::endl;
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while ((check = myScanOp->nextResult(true)) == 0)
{
do {
if (myScanOp->deleteCurrentTuple() != 0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
eletedRows++;
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = myScanOp->nextResult(false)) == 0);
/**
* NoCommit when all cached tuple have been marked for deletion
*/
if (check != -1)
{
check = myTrans->execute(NdbTransaction::NoCommit);
}
/**
* Check for errors
*/
err = myTrans->getNdbError();
if (check == -1)
{
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
/**
* End of loop
*/
}
/**
* Commit all prepared operations
*/
if (myTrans->execute(NdbTransaction::Commit) == -1)
{
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return 0;
}
if (myTrans!=0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
}
return -1;
}
int scan_update(Ndb* myNdb, int update_column, const char * before_color,
const char * after_color)
{
// Scan all records exclusive and update
// them one by one
intretryAttempt = 0;
const intretryMax = 10;
int updatedRows = 0;
int check;
NdbErrorerr;
NdbTransaction* myTrans;
NdbScanOperation* myScanOp;
const NdbDictionary::Dictionary* myDict= myNdb->getDictionary();
const NdbDictionary::Table *myTable= myDict->getTable("api_scan");
if (myTable == NULL) APIERROR(myDict->getNdbError());
/**
* Loop as long as :
*retryMax not reached
*failed operations due to TEMPORARY erros
*
* Exit loop;
*retryMax reached
*Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation " << retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout <<err.message << std::endl;
return -1;
}
/**
* Get a scan operation.
*/
myScanOp = myTrans->getNdbScanOperation(myTable);
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define a result set for the scan.
*/
if (myScanOp->readTuples(NdbOperation::LM_Exclusive) )
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Use NdbScanFilter to define a search critera
*/
NdbScanFilter filter(myScanOp);
if (filter.begin(NdbScanFilter::AND) < 0||
filter.cmp(NdbScanFilter::COND_EQ, update_column, before_color, 20) <0||
filter.end() <0)
{
std::cout <<myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan(NoCommit since we are only reading at this stage);
*/
if (myTrans->execute(NdbTransaction::NoCommit) != 0)
{
err = myTrans->getNdbError();
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while ((check = myScanOp->nextResult(true)) == 0)
{
do {
/**
* Get update operation
*/
NdbOperation * myUpdateOp = myScanOp->updateCurrentTuple();
if (myUpdateOp == 0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
updatedRows++;
/**
* do the update
*/
myUpdateOp->setValue(update_column, after_color);
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = myScanOp->nextResult(false)) == 0);
/**
* NoCommit when all cached tuple have been updated
*/
if (check != -1)
{
check = myTrans->execute(NdbTransaction::NoCommit);
}
/**
* Check for errors
*/
err = myTrans->getNdbError();
if (check == -1)
{
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
/**
* End of loop
*/
}
/**
* Commit all prepared operations
*/
if (myTrans->execute(NdbTransaction::Commit) == -1)
{
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
}
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return 0;
}
if (myTrans!=0)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
}
return -1;
}
int scan_print(Ndb * myNdb)
{
// Scan all records exclusive and update
// them one by one
intretryAttempt = 0;
const intretryMax = 10;
int fetchedRows = 0;
int check;
NdbErrorerr;
NdbTransaction* myTrans;
NdbScanOperation* myScanOp;
/* Result of reading attribute value, three columns:
REG_NO, BRAND, and COLOR
*/
NdbRecAttr *myRecAttr[3];
const NdbDictionary::Dictionary* myDict= myNdb->getDictionary();
const NdbDictionary::Table *myTable= myDict->getTable("api_scan");
if (myTable == NULL) APIERROR(myDict->getNdbError());
/**
* Loop as long as :
*retryMax not reached
*failed operations due to TEMPORARY erros
*
* Exit loop;
*retyrMax reached
*Permanent error (return -1)
*/
while (true)
{
if (retryAttempt >= retryMax)
{
std::cout << "ERROR: has retried this operation "
<< retryAttempt
<< " times, failing!" << std::endl;
return -1;
}
myTrans = myNdb->startTransaction();
if (myTrans == NULL)
{
const NdbError err = myNdb->getNdbError();
if (err.status == NdbError::TemporaryError)
{
milliSleep(50);
retryAttempt++;
continue;
}
std::cout << err.message << std::endl;
return -1;
}
/*
* Define a scan operation.
* NDBAPI.
*/
myScanOp = myTrans->getNdbScanOperation(myTable);
if (myScanOp == NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Read without locks, without being placed in lock queue
*/
if (myScanOp->readTuples(NdbOperation::LM_CommittedRead) == -1)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Define storage for fetched attributes.
* E.g., the resulting attributes of executing
* myOp->getValue("REG_NO") is placed in myRecAttr[0].
* No data exists in myRecAttr until transaction has commited!
*/
myRecAttr[0] = myScanOp->getValue("REG_NO");
myRecAttr[1] = myScanOp->getValue("BRAND");
myRecAttr[2] = myScanOp->getValue("COLOR");
if (myRecAttr[0] ==NULL || myRecAttr[1] == NULL || myRecAttr[2]==NULL)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* Start scan (NoCommit since we are only reading at this stage);
*/
if (myTrans->execute(NdbTransaction::NoCommit) != 0)
{
err = myTrans->getNdbError();
if (err.status == NdbError::TemporaryError)
{
std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans);
milliSleep(50);
continue;
}
std::cout << err.code << std::endl;
std::cout << myTrans->getNdbError().code << std::endl;
myNdb->closeTransaction(myTrans);
return -1;
}
/**
* start of loop: nextResult(true) means that "parallelism" number of
* rows are fetched from NDB and cached in NDBAPI
*/
while ((check = myScanOp->nextResult(true)) == 0)
{
do {
fetchedRows++;
/**
* printREG_NO unsigned int
*/
std::cout << myRecAttr[0]->u_32_value() << "\t";
/**
* printBRAND character string
*/
std::cout << myRecAttr[1]->aRef() << "\t";
/**
* printCOLOR character string
*/
std::cout << myRecAttr[2]->aRef() << std::endl;
/**
* nextResult(false) means that the records
* cached in the NDBAPI are modified before
* fetching more rows from NDB.
*/
} while((check = myScanOp->nextResult(false)) == 0);
}
myNdb->closeTransaction(myTrans);
return 1;
}
return -1;
}
void mysql_connect_and_create(MYSQL & mysql, const char *socket)
{
bool ok;
ok = mysql_real_connect(&mysql, "localhost", "root",
"", "", 0, socket, 0);
if (ok) {
mysql_query(&mysql, "CREATE DATABASE ndb_examples");
ok = ! mysql_select_db(&mysql, "ndb_examples");
}
if (ok) {
create_table(mysql);
}
if (! ok) MYSQLERROR(mysql);
}
void ndb_run_scan(const char * connectstring)
{
/**************************************************************
* Connect to ndb cluster *
**************************************************************/
Ndb_cluster_connection cluster_connection(connectstring);
if (cluster_connection.connect(4, 5, 1))
{
std::cout << "Unable to connect to cluster within 30 secs." << std::endl;
exit(-1);
}
// Optionally connect and wait for the storage nodes (ndbd's)
if (cluster_connection.wait_until_ready(30,0) < 0)
{
std::cout << "Cluster was not ready within 30 secs.\n";
exit(-1);
}
Ndb myNdb(&cluster_connection,"ndb_examples");
if (myNdb.init(1024) == -1) { // Set max 1024parallel transactions
APIERROR(myNdb.getNdbError());
exit(-1);
}
/*******************************************
* Check table definition*
*******************************************/
int column_color;
{
const NdbDictionary::Dictionary* myDict= myNdb.getDictionary();
const NdbDictionary::Table *t= myDict->getTable("api_scan");
if (t == NULL)
{
std::cout << "Dictionary::getTable() failed.";
exit(-1);
}
Car car;
if (t->getColumn("COLOR")->getLength() != sizeof(car.color) ||
t->getColumn("BRAND")->getLength() != sizeof(car.brand))
{
std::cout << "Wrong table definition" << std::endl;
exit(-1);
}
column_color= t->getColumn("COLOR")->getColumnNo();
}
if (populate(&myNdb) > 0)
std::cout << "populate: Success!" << std::endl;
if (scan_print(&myNdb) > 0)
std::cout << "scan_print: Success!" << std::endl<< std::endl;
std::cout << "Going to delete all pink cars!" << std::endl;
{
/**
* Note! color needs to be of exact the same size as column defined
*/
Car tmp;
sprintf(tmp.color, "Pink");
if (scan_delete(&myNdb, column_color, tmp.color) > 0)
std::cout << "scan_delete: Success!" << std::endl<< std::endl;
}
if (scan_print(&myNdb) > 0)
std::cout << "scan_print: Success!" << std::endl<< std::endl;
{
/**
* Note! color1 & 2 need to be of exact the same size as column defined
*/
Car tmp1, tmp2;
sprintf(tmp1.color, "Blue");
sprintf(tmp2.color, "Black");
std::cout << "Going to update all " << tmp1.color
<< " cars to " << tmp2.color << " cars!" << std::endl;
if (scan_update(&myNdb, column_color, tmp1.color, tmp2.color) > 0)
std::cout << "scan_update: Success!" << std::endl<< std::endl;
}
if (scan_print(&myNdb) > 0)
std::cout << "scan_print: Success!" << std::endl<< std::endl;
}
int main(int argc, char** argv)
{
if (argc != 3)
{
std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n";
exit(-1);
}
char * mysqld_sock= argv[1];
const char *connectstring = argv[2];
MYSQL mysql;
mysql_init(& mysql);
mysql_connect_and_create(mysql, mysqld_sock);
ndb_init();
ndb_run_scan(connectstring);
ndb_end(0);
mysql_close(&mysql);
return 0;
}
2.5.5. Пример NDB API: использование вторичных индексов в просмотрах
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 с хэш-индексами
NdbRecord
.
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
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
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.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.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;
}
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 <NdbApi.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstring>
using namespace std;
/*
See раздел 2.5.14,
for listings of these utilities.
*/
#include "../common/error_handling.hpp"
#include "../common/array_adapter.hpp"
#include "../common/ndb_util.hpp"
#include "../common/util.hpp"
// Do a cleanup of all inserted rows
static void do_cleanup(Ndb& ndb)
{
const NdbDictionary::Dictionary* dict = ndb.getDictionary();
const NdbDictionary::Table *table = dict->getTable("api_array_using_adapter");
if (table == nullptr) APIERROR(dict->getNdbError());
NdbTransaction *transaction= ndb.startTransaction();
if (transaction == nullptr) APIERROR(ndb.getNdbError());
// Delete all 21 rows using a single transaction
for (int i = 0; i <= 20; i++)
{
NdbOperation* myOperation = transaction->getNdbOperation(table);
if (myOperation == nullptr) APIERROR(transaction->getNdbError());
myOperation->deleteTuple();
myOperation->equal("ATTR1", i);
}
if (transaction->execute(NdbTransaction::Commit) != 0)
{
APIERROR(transaction->getNdbError());
}
ndb.closeTransaction(transaction);
}
// Use one transaction and insert 21 rows in one batch.
static void do_insert(Ndb& ndb)
{
const NdbDictionary::Dictionary* dict = ndb.getDictionary();
const NdbDictionary::Table *table = dict->getTable("api_array_using_adapter");
if (table == NULL)
{
APIERROR(dict->getNdbError());
}
// Get a column object for each CHAR/VARCHAR/BINARY/VARBINARY column
// to insert into.
const NdbDictionary::Column *column2 = table->getColumn("ATTR2");
if (column2 == NULL)
{
APIERROR(dict->getNdbError());
}
const NdbDictionary::Column *column3 = table->getColumn("ATTR3");
if (column3 == NULL)
{
APIERROR(dict->getNdbError());
}
const NdbDictionary::Column *column4 = table->getColumn("ATTR4");
if (column4 == NULL)
{
APIERROR(dict->getNdbError());
}
const NdbDictionary::Column *column5 = table->getColumn("ATTR5");
if (column5 == NULL)
{
APIERROR(dict->getNdbError());
}
const NdbDictionary::Column *column6 = table->getColumn("ATTR6");
if (column6 == NULL)
{
APIERROR(dict->getNdbError());
}
const NdbDictionary::Column *column7 = table->getColumn("ATTR7");
if (column7 == NULL)
{
APIERROR(dict->getNdbError());
}
// Create a read/write attribute adapter to be used for all
// CHAR/VARCHAR/BINARY/VARBINARY columns.
ReadWriteArrayAdapter attr_adapter;
// Create and initialize sample data.
const string meter = 50 * string("''''-,,,,|");
unsigned char binary_meter[500];
for (unsigned i = 0; i < 500; i++)
{
binary_meter[i] = (unsigned char)(i % 256);
}
NdbTransaction *transaction= ndb.startTransaction();
if (transaction == NULL) APIERROR(ndb.getNdbError());
// Create 21 operations and put a reference to them in a vector to
// be able to find failing operations.
vector<NdbOperation*> operations;
for (int i = 0; i <= 20; i++)
{
NdbOperation* operation = transaction->getNdbOperation(table);
if (operation == NULL) APIERROR(transaction->getNdbError());
operation->insertTuple();
operation->equal("ATTR1", i);
/* use ReadWrite Adapter to convert string to aRefs */
ReadWriteArrayAdapter::ErrorType error;
char *attr2_aRef;
attr2_aRef= attr_adapter.make_aRef(column2, meter.substr(0,i), error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"make_aRef failed for ATTR2");
operation->setValue("ATTR2", attr2_aRef);
char *attr3_aRef;
attr3_aRef= attr_adapter.make_aRef(column3, meter.substr(0,i), error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"make_aRef failed for ATTR3");
operation->setValue("ATTR3", attr3_aRef);
char *attr4_aRef;
attr4_aRef= attr_adapter.make_aRef(column4, meter.substr(0,20*i), error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"make_aRef failed for ATTR4");
operation->setValue("ATTR4", attr4_aRef);
char* attr5_aRef;
char* attr5_first;
attr_adapter.allocate_in_bytes(column5, attr5_aRef, attr5_first,i,error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"allocate_in_bytes failed for ATTR5");
memcpy(attr5_first, binary_meter, i);
operation->setValue("ATTR5", attr5_aRef);
char* attr6_aRef;
char* attr6_first;
attr_adapter.allocate_in_bytes(column6, attr6_aRef, attr6_first,i,error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"allocate_in_bytes failed for ATTR6");
memcpy(attr6_first, binary_meter, i);
operation->setValue("ATTR6", attr6_aRef);
char* attr7_aRef;
char* attr7_first;
attr_adapter.allocate_in_bytes(column7, attr7_aRef, attr7_first,
20*i, error);
PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success,
"allocate_in_bytes failed for ATTR7");
memcpy(attr7_first, binary_meter, 20*i);
operation->setValue("ATTR7", attr7_aRef);
operations.push_back(operation);
}
// Now execute all operations in one batch, and check for errors.
if (transaction->execute( NdbTransaction::Commit ) != 0)
{
for (size_t i = 0; i < operations.size(); i++)
{
const NdbError err= operations[i]->getNdbError();
if (err.code != NdbError::Success)
{
cout << "Error inserting Row : " << i << endl;
PRINT_ERROR(err.code, err.message);
}
}
APIERROR(transaction->getNdbError());
}
ndb.closeTransaction(transaction);
}
/*
Reads the row with id = 17
Retrieves an prints value of the [VAR]CHAR/BINARY using array_adapter
*/
static void do_read(Ndb& ndb)
{
const NdbDictionary::Dictionary* dict= ndb.getDictionary();
const NdbDictionary::Table* table= dict->getTable("api_array_using_adapter");
if (table == NULL) APIERROR(dict->getNdbError());
NdbTransaction *transaction= ndb.startTransaction();
if (transaction == NULL) APIERROR(ndb.getNdbError());
NdbOperation *operation= transaction->getNdbOperation(table);
if (operation == NULL) APIERROR(transaction->getNdbError());
operation->readTuple(NdbOperation::LM_Read);
operation->equal("ATTR1", 17);
vector<NdbRecAttr*> attr;
const int column_count= table->getNoOfColumns();
attr.reserve(column_count);
attr.push_back(nullptr);
for (int i= 1; i < column_count; i++)
{
attr.push_back(operation->getValue(i, NULL));
if (attr[i] == NULL) APIERROR(transaction->getNdbError());
}
if (transaction->execute( NdbTransaction::Commit ) == -1)
APIERROR(transaction->getNdbError());
/* Now use an array adapter to read the data from columns */
const ReadOnlyArrayAdapter attr_adapter;
ReadOnlyArrayAdapter::ErrorType error;
/* print the fetched data */
cout << "Row ID : 17\n";
for (int i= 1; i < column_count; i++)
{
if (attr[i] != NULL)
{
NdbDictionary::Column::Type column_type = attr[i]->getType();
cout << "Column id: " << i
<< ", name: " << attr[i]->getColumn()->getName()
<< ", size: " << attr[i]->get_size_in_bytes()
<< ", type: " << column_type_to_string(attr[i]->getType());
if (attr_adapter.is_binary_array_type(column_type))
{
/* if column is [VAR]BINARY, get the byte array and print their sum */
const char* data_ptr;
size_t data_length;
attr_adapter.get_byte_array(attr[i], data_ptr,
data_length, error);
if (error == ReadOnlyArrayAdapter::Success)
{
int sum = 0;
for (size_t j = 0; j < data_length; j++)
sum += (int)(data_ptr[j]);
cout << ", stored bytes length: " << data_length
<< ", sum of byte array: " << sum << endl;
}
else cout << ", error fetching value." << endl;
}
else
{
/* if the column is [VAR]CHAR, retrieve the string and print */
std::string value= attr_adapter.get_string(attr[i], error);
if (error == ReadOnlyArrayAdapter::Success)
{
cout << ", stored string length: " << value.length()
<< ", value: " << value << endl;
}
else cout << ", error fetching value." << endl;
}
}
}
ndb.closeTransaction(transaction);
}
static void run_application(Ndb_cluster_connection &cluster_connection,
const char* database_name)
{
/********************************************
* Connect to database via NdbApi *
********************************************/
// Object representing the database
Ndb ndb( &cluster_connection, database_name);
if (ndb.init()) APIERROR(ndb.getNdbError());
/*
* Do different operations on database
*/
do_insert(ndb);
do_read(ndb);
do_cleanup(ndb);
}
int main(int argc, char** argv)
{
if (argc != 3)
{
std::cout << "Arguments are <connect_string cluster> <database_name>.\n";
exit(-1);
}
/* ndb_init must be called first */
ndb_init();
{
/* connect to cluster */
const char *connectstring = argv[1];
Ndb_cluster_connection cluster_connection(connectstring);
if (cluster_connection.connect(30 /* retries */,
1 /* delay between retries */,
0 /* verbose */))
{
std::cout << "Cluster management server was not ready within 30 secs.\n";
exit(-1);
}
/* Connect and wait for the storage nodes */
if (cluster_connection.wait_until_ready(30,10) < 0)
{
std::cout << "Cluster was not ready within 30 secs.\n";
exit(-1);
}
/* run the application code */
const char* dbname = argv[2];
run_application(cluster_connection, dbname);
}
ndb_end(0);
return 0;
}
2.5.13. Пример Timestamp2
timestamp2.cpp
обеспечивает пример работы в приложениях API NDB с
новыми временными типами данных MySQL,
поддерживающие доли секунды, которые были осуществлены в
MySQL 5.6, NDB 7.3 и NDB 7.4.
#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
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
Найди своих коллег! |
Вы можете направить письмо администратору этой странички, Алексею Паутову.