Переведено БНТП по заказу Interface Ltd.
База данных RDM Embedded от Birdstep Technology является чрезвычайно гибкой СУБД, имеющей более 150 интерфейсов прикладного программирования (API) для надежного управления базой данных. В данной статье описан простой пример, использующий встроенный набор API для работы с RDM Embedded.
Статья предназначается для читателей, у которых имеется достаточный опыт в разработке приложений на языке C, а на рабочем компьютере установлен комплект разработчика (SDK) RDM Embedded.
Сам SDK для RDM Embedded можно загрузить по адресу http://www.birdstep.com/downloads/database_download.php3 (следуя ссылке «download free SDK»). Интерфейс API и описания можно найти здесь.
Ниже перечислены все компоненты, необходимые для доступа к базе данных RDM Embedded из приложений C/C++, созданных для платформы Windows:
После завершения установки этих компонентов требуется выполнить три простых конфигурационных шага
Имеются два параметра окружения, которые необходимо установить для настройки доступа к вашим данным:
Доступ к базе данных RDM Embedded осуществляется с помощью заголовочного файла на C и словарного файла RDM, причем оба эти файла создаются утилитой ddlp, включенной в SDK базы данных RDM Embedded. В качестве рабочего примера, мы создадим заголовочный и словарный файлы, исходя из имеющейся схемы.
Приведенная ниже схема описывает базу данных simpledb, имеющую одну таблицу, названную simpletb. Таблица simpletb содержит 3 поля: Первое поле с названием fld1 является ключевым с элементами типа long, второе названо fld2 с элементами типа short и третье - fld3, представляющее собой массив char[10]. Окончательно, в файле datafile1.D01 будет храниться содержимое базы данных, а в файле keyfile1.K01 будут содержаться индексированные элементы fld1.
Для создания заголовочного и словарного файла сначала скопируйте приведенную ниже схему в текстовый файл, названный schema.ddl. Затем, запустив сеанс DOS, выполните утилиту ddlp для файла схемы: ddlp schema.ddl.
database simpledb { data file one = "datafile1.D01" contains simpletb; key long fld1; } } |
С помощью утилиты ddlp вы создадите два новых файла:
Для подготовки приложения к использованию встроенного интерфейса включите в ваши исходные файлы следующие операторы include:
#include <stdio.h> #include "rdm.h" #include "simpledb.h" |
Теперь ваше приложение сконфигурировано для доступа к данным вашей RDM Embedded.
Теперь мы создадим самое простое приложение «Hello World». Приложение будет состоять из следующих разделов:
Для осуществления многопользовательского доступа к базе данных RDM Embedded вам следует определить интерфейс менеджера блокировок. Имеется два менеджера блокировок: внутренний менеджер блокировок для окружений, в которых все пользователи работают за одним и тем же компьютером, и менеджер блокировок для TCP, где клиенты распределены в рамках вычислительной сети. В качестве примера последней блокировки, используя d_lockcomm API, можно выбрать:
d_lockcomm(psp_lmcFind("TCP"), DEFAULT_TASK) |
Затем можно выбрать именованный менеджер блокировок, с которым приложение будет обмениваться информацией. Это выполняется с использованием d_lockmgr API, где вторым параметром является IP-адрес компьютера, на котором выполняется процесс менеджера блокировок. Более подробно процесс менеджера блокировок будет обсужден ниже.
d_lockmgr("192.168.2.97", DEFAULT_TASK) <примечание: Должен быть использован ваш IP-адрес> |
Затем определите имя пользователя с использованием d_dbuserid API.
d_dbuserid("TheUser", DEFAULT_TASK) |
Для выполнения инициализации базы данных сначала откройте ее в эксклюзивном режиме с использованием d_open API, затем инициализируйте с использованием d_initialize API. После этого закройте базу данных, чтобы можно было открыть ее позже в режиме совместного использования.
d_open("simpledb", "x", DEFAULT_TASK)
d_initialize(DEFAULT_TASK, CURR_DB) d_close(DEFAULT_TASK) |
После инициализации базы данных таблица simpletb может быть заполнена информацией. Для этого нужно выполнить следующие шаги: Запустить транзакцию, затребовать блокировку, добавить новые данные, и затем зафиксировать транзакцию. Запустите новую транзакцию, названную «Enter»:
d_dbuserid("TheUser", DEFAULT_TASK) |
Поместите блокировку записи на таблицу simpletb:
d_reclock(SIMPLETB, "w", DEFAULT_TASK, CURR_DB) |
Заполните индивидуальные элементы:
while (j <= 100) { i_simpletb.fld1 = rand(); |
Завершите транзакцию, при этом все блокировки будут сняты, а любые изменения будут внесены в базу данных.
d_close(DEFAULT_TASK) |
Для демонстрации процедур навигации будет выполнена навигация по записи базы данных для подтверждения правильности ввода данных в разделе 3. При работе с транзакцией (в этот раз она названа «Record»), будет использована блокировка таблицы на чтение («read»). Для упрощения процесса сканирования, используйте d_recfirst and d_recnext API’s в цикле и выведите содержимое поля один и поля два:
// Запуск новой транзакции: "Record" d_dbuserid("TheUser", DEFAULT_TASK) // Установка блокировки на чтение ("read") на SIMPLETB for (status = d_recfrst(SIMPLETB, DEFAULT_TASK, CURR_DB); d_recread(&j_simpletb, DEFAULT_TASK, CURR_DB) /* Завершение транзакции и снятие всех блокировок */ |
Следует отметить, что этот метод сканирования иллюстрирует архитектуру сетевой модели RDM Embedded, которая в своей простейшей форме является просто связанным списком. Каждая из распечатанных записей выводится в том же самом порядке, что и связанный список.
Другим навигационным примером служит навигация по базе данных с помощью индексированного поля fld1. Снова при работе с транзакцией (в этот раз она названа «Key»), будет использована блокировка таблицы на чтение («read»). Для упрощения процесса сканирования, используйте d_ keyfrst and d_ keynext API в цикле и выведите содержимое поля один и поля два:
// Запуск новой транзакции: "Key" d_dbuserid("TheUser", DEFAULT_TASK) // Установка блокировки на чтение ("read") на SIMPLETB for (status = d_keyfrst(FLD1, DEFAULT_TASK, CURR_DB); status == S_OKAY; status = d_keynext(FLD1, DEFAULT_TASK, CURR_DB)) d_recread(&i_simpletb, DEFAULT_TASK, CURR_DB) /* Завершение транзакции и снятие всех блокировок */ |
Последнее, что нужно сделать – это закрыть базу данных с использованием d_close API:
d_close(DEFAULT_TASK) |
После завершения работы над исходным кодом приложения база данных может быть скомпилирована. Этот пример использует интегрированную среду разработки MSVC 6.0 – просто нажмите <F7> для компиляции. Ниже перечислены некоторые типичные ошибки, вероятные при компиляции:
Возможные ошибки компиляции |
|
Ошибка: | Cannot open include file (невозможно открыть файл заголовка): 'rdm.h' |
Решение: | Убедитесь в том, что в установках параметров проекта вы указали правильный путь к заголовочному файлу rdm.h. Если вы работаете, используя стандартную установку, этот файл располагается в следующем каталоге
C:\Program Files\Birdstep Technology\RDM Embedded 7.0\include |
Ошибка: | Unresolved external symbol _psp_lmcFindA@4 (неразрешенный внешний символ _psp_lmcFindA@4) |
Решение: | Вы не включили библиотеку psp7[u] в установки системных путей. Эта библиотека требуется в том случае, если вы хотите создать многопользовательский доступ к базе данных RDM Embedded. |
Перед выполнением программы HelloWorld запустите менеджер блокировок. Это отдельный процесс, который выполняется на том же самом компьютере, что и приложение, хотя это необязательно для менеджера блокировок TCP. Для запуска просто введите «lm», находясь в сеансе DOS. Будет выдано следующее сообщение:
Lock Manager RDM Embedded 7.0.367 [16-Jul-2003] http://www.birdstep.com Copyright (c) 1992-2003 Birdstep Technology, Inc. All Rights Reserved. TCP/IP sockets Lock manager Lock Manager - '192.168.2.97’ |
IP-адрес является адресом, используемым в d_lockmgr API в разделе 1. Ваш IP-адрес будет другим.
Последнее, что осталось – выполнение. Находясь в среде MSVC, просто нажмите <ctrl><F5>. Могут наблюдаться несколько стандартных ошибок:
Если все сделано правильно, то на экран должна быть выдана следующая информация
SCANNING | DATABASE BY | RECORD INSTANCES |
field 1: | 41 | field 2: 1 |
field 1: | 18467 | field 2: 2 |
field 1: | 6334 | field 2: 3 |
field 1: | 26500 | field 2: 4 |
|
||
SCANNING | DATABASE BY | KEY FIELD: fld1 |
field 1: | 41 | field 2: 1 |
field 1: | 6334 | field 2: 3 |
field 1: | 18467 | field 2: 2 |
field 1: | 19169 | field 2: 5 |
field 1: | 26500 | field 2: 4 |
|
Возможные ошибки во время выполнения |
|
Ошибка: | TCP/IP connect fail (сбой подключения по TCP/IP): (10061), SYSTEM/OS error (системная ошибка): -920, no lock manager is installed (не установлен менеджер блокировок) |
Решение (1): | Убедитесь в том, что вы запустили процесс менеджера блокировок. |
Решение (2): | Убедитесь в том, что IP-адрес d_lockmgr API является тем же самым IP-адресом компьютера, на котором выполняется процесс менеджера блокировок. |
Ошибка: | SYSTEM/OS error (системная ошибка): -944, TAF-lockmgr synchronization (сбой синхронизации менеджера блокировок) |
Решение: | Удалите файл rdm.taf. |
Исходный текст для файлов проекта MSVC 6.0 можно найти здесь.
За дополнительной информацией обращайтесь в компанию Interface Ltd.
INTERFACE Ltd. |
|