Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

Использование встроенного интерфейса при работе с базой данных RDM Embedded от компании Birdstep Technology

Переведено БНТП по заказу Interface Ltd.

Аннотация

Birdstep TechnologyБаза данных 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:

  1. Среда интегрированной разработки MSVC 6.0.
  2. База данных RDM Embedded 7.x для Windows.

После завершения установки этих компонентов требуется выполнить три простых конфигурационных шага

Шаг 1) Конфигурирование окружения

Имеются два параметра окружения, которые необходимо установить для настройки доступа к вашим данным:

Шаг 2) Конфигурирование базы данных

Доступ к базе данных 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 file two = "keyfile1.K01" contains fld1;

record simpletb
{

key long fld1;
short fld2;
char fld3[10];

}

}

С помощью утилиты ddlp вы создадите два новых файла:

Шаг 3) Приложение

Для подготовки приложения к использованию встроенного интерфейса включите в ваши исходные файлы следующие операторы include:

#include <stdio.h>
#include "rdm.h"
#include "simpledb.h"

Теперь ваше приложение сконфигурировано для доступа к данным вашей RDM Embedded.

Создаем первое приложение, использующее RDM Embedded

Теперь мы создадим самое простое приложение «Hello World». Приложение будет состоять из следующих разделов:

  1. Определение менеджера блокировок.
  2. Инициализация базы данных.
  3. Наполнение базы данных информацией.
  4. Сканирование базы данных с использованием двух методов навигации:
    1. Сканирование индивидуальных экземпляров записей
    2. Сканирование с помощью индексированных полей
  5. Закрытие базы данных
  6. Компиляция
  7. Менеджер блокировок
  8. Выполнение

Раздел 1: Определение менеджера блокировок

Для осуществления многопользовательского доступа к базе данных 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)

Раздел 2: Инициализация базы данных

Для выполнения инициализации базы данных сначала откройте ее в эксклюзивном режиме с использованием d_open API, затем инициализируйте с использованием d_initialize API. После этого закройте базу данных, чтобы можно было открыть ее позже в режиме совместного использования.

d_open("simpledb", "x", DEFAULT_TASK)

d_initialize(DEFAULT_TASK, CURR_DB)

d_close(DEFAULT_TASK)

Раздел 3: Наполнение базы данных информацией

После инициализации базы данных таблица simpletb может быть заполнена информацией. Для этого нужно выполнить следующие шаги: Запустить транзакцию, затребовать блокировку, добавить новые данные, и затем зафиксировать транзакцию. Запустите новую транзакцию, названную «Enter»:

d_dbuserid("TheUser", DEFAULT_TASK)

Поместите блокировку записи на таблицу simpletb:

d_reclock(SIMPLETB, "w", DEFAULT_TASK, CURR_DB)

Заполните индивидуальные элементы:

while (j <= 100)
{

i_simpletb.fld1 = rand();
i_simpletb.fld2 = j;
strcpy(i_simpletb.fld3,"Hello World!");
d_reclock(SIMPLETB, "w", DEFAULT_TASK, CURR_DB)
j++;

}

Завершите транзакцию, при этом все блокировки будут сняты, а любые изменения будут внесены в базу данных.

d_close(DEFAULT_TASK)

Раздел 4: Навигация по базе данных

Раздел 4a: Навигация по экземплярам записей

Для демонстрации процедур навигации будет выполнена навигация по записи базы данных для подтверждения правильности ввода данных в разделе 3. При работе с транзакцией (в этот раз она названа «Record»), будет использована блокировка таблицы на чтение («read»). Для упрощения процесса сканирования, используйте d_recfirst and d_recnext API’s в цикле и выведите содержимое поля один и поля два:

// Запуск новой транзакции: "Record"
d_dbuserid("TheUser", DEFAULT_TASK)

// Установка блокировки на чтение ("read") на SIMPLETB
d_reclock(SIMPLETB, "r", DEFAULT_TASK, CURR_DB)

for (status = d_recfrst(SIMPLETB, DEFAULT_TASK, CURR_DB);
  status == S_OKAY; status = d_recnext(DEFAULT_TASK, CURR_DB))
{

d_recread(&j_simpletb, DEFAULT_TASK, CURR_DB)
printf("\tfield 1: %d \tfield 2: %d\n", i_simpletb.fld1, i_simpletb.fld2);

}

/* Завершение транзакции и снятие всех блокировок */
d_close(DEFAULT_TASK)

Следует отметить, что этот метод сканирования иллюстрирует архитектуру сетевой модели RDM Embedded, которая в своей простейшей форме является просто связанным списком. Каждая из распечатанных записей выводится в том же самом порядке, что и связанный список.

Раздел 4b: Навигация с помощью индексированного поля

Другим навигационным примером служит навигация по базе данных с помощью индексированного поля fld1. Снова при работе с транзакцией (в этот раз она названа «Key»), будет использована блокировка таблицы на чтение («read»). Для упрощения процесса сканирования, используйте d_ keyfrst and d_ keynext API в цикле и выведите содержимое поля один и поля два:

// Запуск новой транзакции: "Key"
d_dbuserid("TheUser", DEFAULT_TASK)

// Установка блокировки на чтение ("read") на SIMPLETB
d_reclock(SIMPLETB, "w", DEFAULT_TASK, CURR_DB)

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)
printf("\tfield 1: %d \tfield 2: %d\n", i_simpletb.fld1, i_simpletb.fld2);

}

/* Завершение транзакции и снятие всех блокировок */
d_close(DEFAULT_TASK)

Раздел 5: Закрытие базы данных

Последнее, что нужно сделать – это закрыть базу данных с использованием d_close API:

d_close(DEFAULT_TASK)

Раздел 6: Компиляция

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

Раздел 7: Менеджер блокировок

Перед выполнением программы 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-адрес будет другим.

Раздел 8: Выполнение

Последнее, что осталось – выполнение. Находясь в среде 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


total of 5 simpletb records in database

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


total of 5 simpletb records in database

Возможные ошибки во время выполнения

Возможные ошибки во время выполнения

Ошибка: 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.

Обсудить на форуме Birdstep

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 20.01.06