Inferno OS Wiki
Advertisement
Поддержка баз данных в Inferno
Оригинал: http://agni.csa.iisc.ernet.in/OperatingSystems/Inferno/dbinterface/dbinterface.html
Автор: D. Knudsen

ОБЗОР[]

Мир баз данных разнороден, даже та его часть, которая поддерживает доступ через Structured Query Language (SQL). Inferno может обеспечить общий стандартный интерфейс к этому подмножеству баз данных услиливая мощь сетевой поддержкой, динамическим пространством имен, и надежной безопасностью.

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

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

Введение[]

Разработчики приложений получат выгоду от следующих уникальных особенностей Inferno:

Язык Limbo отражает возможности системы Inferno. В следствии этого, Limbo относительно "выразительный" язык, который дает возможность быстрее разработать и написать приложение, с меньшими усилиями как на стадии кодирования, так и на этапе отладки.

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

Поскольку система Inferno намного меньше других операционных систем со сходными возможностями, Inferno-приложения на "тонких" клиентах, таких как приемники кабельного телевидения, сетевые компьютеры и смартфоны могут предоставить доступ к базам данных промышленного уровня. Для большинства устройств, стесненных аппаратными ресурсами, приложение может быть запущено на сервере используя "клиент" в качестве устройства предоставляющего ввод-вывод.

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

Модуль DB[]

Все что требуется разработчику приложений баз данных, это простой, единообразный API, который предоставляет стандартизированный доступ к (вероятно удаленным) базам даных на не-Inferno платформах. Inferno обеспечивает такие возможности в виде двух различных частей. Первая - написанный на Limbo загружаемый модуль DB, предоставляющий API, который может быть использован для доступа к любой базе данных, поддерживающей SQL. Второй - часть программного обеспечения Inferno для поддержки баз данных на сервере.

Разработчик получает доступ к модулю DB стандартными средствами языка Limbo:

include "db.m";
db := load DB DB->PATH;

Модуль DB содержит одну функцию open(), и один абстрактный тип данных DB_Handle. Вызов функции осуществляется следующим образом:

dh : ref DB->DB_Handle;
(dh, errs) = open(addr, user, password, dbname);

Первая строка объявляет переменную dh, имеющую тип ссылки на экземпляр абстрактного типа DB_Handle, вторая - вызывает функцию чтобы получить ссылку на экземпляр (если вызов функции терпит неудачу, errs будет содержать описание сбоя).

Функция open иллюстрирует способность Limbo-функций возвращать множество значений в форме кортежей. Это типичное использование, где первый элемент кортежа не nil, а второй - nil в случае успешного вызова или true, если вызов завершился неудачей. Аргумент addr это строка вида netaddr!service, где netaddr - сетевой адрес сервера баз данных (например, db.server.lucent.com), а service - обычно infdb, сервис баз данных Inferno.

Строки user и password требуются многими СУБД для контроля доступа к данным в базе dbname (это тоже строка). Возвращаемое значение dh - ссылка на экземпляр абстрактного типа DB_Handle, который включает функции, нужные для манипулирования открытой базой данных:

(status, errmsg) = dh.SQL(sql_command);
numcols = dh.columns();
row = dh.nextRow();
(status, field) = dh.read(col_number);
count = dh.write(param_position, field);
col_name = dh.columnTitle(col_number);

Первая строка - запрос в форме Structured Query Language (SQL) к серверу. Если запрос вернул набор результатов (обычно вывод запроса select), тогда columns содержит число колонок в результирующем наборе, nextRow переходит к следующей строке результата, за один раз, и columnTitle и read возвращает заголовки колонок и значение текущей строки соответственно. Имена колонок возвращаются как строки, в то время как значения полей возвращаются в виде массива байт, в следствии возможности появления двоичных данных (все другие типы данных, включая числовые и дату, возвращаются как стоки).

Функция write используется только тогда, когда приложение должно вставить или обновить двоичные данные в поле; потребность в этом существует из-за того, что соответствующий запрос SQL не может содержать двоичных данных, только местодержатели (placeholders) представляют действительные данные. Аргумент param_position это целое число (1, 2, и т.д.), которое ссылается на первый, второй и т.д. место-держатели в SQL подзапросе. Параметр field - массив байт, для возможности передачи двоичных данных.

Разработчики приложений баз данных могут разрабатывать более сложные и специализированные функции вместо этих общих и низкоуровневых функций.

Подробнее о модуле[]

Модуль DB использует концепцию пространства имен Inferno, что делает его дизайн простым. Функция open() открывает сетевое соединение к указанному сервису. При помощи монтирования соединения к каталогу локального пространства имен, удаленный конец соединения представляется файлами этого каталога. По желанию программист может читать или писать в дескрипторы этих файлов, доступные через абстрактный тип DB_Handle.

API повторяет эти файлы: ctl, SQL, cols, row, entry, and title. Файл ctl используется только для отправки имени пользователя, пароля и имени базы данных удаленному концу соединения. Файл SQL используется для записи запросов SQL, а другие файлы используются для реализации остальной части API. Например, для реализации функции чтения, указанный номер колонки записывается в файл cols, и после этого считывается файл entry для получения значений полей в колонке текущей строки.

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

Модуль Server[]

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

Это сложно потому что:

  • существующие СУБД работают на платформах, отличных от Inferno, и
  • разновидности существующих СУБД затрудняют написание общей программы для доступа к базам данных.

Второй аспект является следствием исторической драмы, разыгрывающейся между производителями с их желаниями к специализации и желанием пользователей к стандартизации. SQL - это старый, продолжающий развиваться язык, борющийся за стандартизацию синтаксиса и семантики сообщений, передаваемых между приложениями баз данных и СУБД. Большинство коммерческих СУБД сегодня поддерживают SQL.

К несчастью, SQL - эволюционизирующий стандарт. Первый стандарт был принят в 1986, затем был SQL 89, текущий SQL 92, и новый, который еще находится в разработке. И если изменения обратно-совместимы, то различные выпуски СУБД разных производителй поддерживают разные стандарты.

Вдобавок, существует несколько программных интерфейсов к SQL, включая статические и динамические встроенные SQL и интерфейсы уровня вызова (CLI). Первый предлагает способы встраивания операторов SQL в другие языки (через использование препроцессора). Второй - набор API, поддерживаемый библиотекой функций.

И наконец, производители не стеснялись предоставлять закрытые проприетарные расширения к SQL и их CLI.

Общим примером CLI является интерфейс Open Database Connectivity (ODBC), работающий на различных платформах Microsoft Windows. ODBC не ограничен конкретными СУБД, но зависит от производителей СУБД, которые должны написать драйвер, имеющий форму динамически загружаемой библиотеки, поддерживающей предопределенный набор API. В настоящее время такие драйвера есть для большинства СУБД, ODBC предоставляет "практически универсальный" доступ к базам данных, пока есть соглашение на самом низком уровне между ODBC и SQL.

Производители также поздно начали поддерживать серверы, позволяющие обращаться клиентским приложениям к их СУБД по сети. И снова, к несчастью, протоколы, используемые этими серверами, закрыты.

Суть вышесказанного, в том, что приложения баз данных соединены с базами данных через некий прозрачный клей, который предоставлен производителем СУБД, и обычно написан на языке Си (и, верояно, требует запуска препроцессора перед компиляцией).

Общая архитектура для поддержки баз данных в Inferno, такова:

Dbarchitecture

Inferno установлена поверх основной ОС на платформе базы данных для обслуживания специальных файлов, представляющих базу данных для модуля DB. Кавычки в "Standard" Database App ("Стандартное" приложение баз данных) поставлены потому, что оно отличается для различных СУБД и должно быть портировано на каждую платформу, поддерживающую каждую СУБД.

Inferno 1.0[]

Выпуск Inferno 1.0 включает модуль DB с описанным выше API (за исключением возможности обновления полей двоичного типа).

"Стандартное" приложение баз данных, включенное в выпуск 1.0, это приложение ODBC, которое запускается на Windows 95 и Windows NT и общается с модулем DB (нет необходимости устанавливать Inferno). Эта программа, называемая infdb, поддерживает синхронные соединения от нескольких Inferno-процессов к одной или разным базам данных.

Этой комбинации должно быть достаточной для того, чтобы позволить разработчику написать пробные приложения. Будущие выпуски Inferno могут содержать новые версии модуля DB, дополнительные программы-серверы баз данных (например, для увеличения производительности и безопасности), но приложения, написанные с использованием текущего API, не потребуют изменений.

Advertisement