Delphi XE5 и MongoDB

Пост в виде конспекта, чтобы не забыть и сохранить полученный опыт и идеи на будущее

Постановка вопроса

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

Одна из двух наиболее быстро развивающихся технологий - СУБД MongoDB компании 10gen (с этого года называется MongoDB) - документ-ориентированная NoSQL СУБД с открытым исходным кодом, горизонтально масштабируемая, обеспечивающая великолепное быстродействие на операциях чтения данных. Как документ-ориентированная СУБД, MongoDB - это довольно обобщённое NoSQL решение. Её можно рассматривать, как альтернативу реляционным СУБД.

Основная особенность - способность хранить и обрабатывать документы сложной структуры, произвольной вложенности, обеспечивая быстрый индексированный поиск по любому полю или набору полей. Такого типа СУБД называют "не имеющими схемы" (Schemaless), поскольку разные записи могут содержать документы различной структуры, причем структуру документа можно менять в дальнейшем. Обладает удобным языком запросов/модификации.  Внутренне представление документов очень близко совпадает с привычными всем записями в формате JSON, что делает их пригодными к "бесшовной" интеграции как в WEB и RESTful приложения, так и в "обычные" прикладные задачи уровня Enterprise.

Встроенным языком для MongoDB Shell является JavaScript. Компания MongoDB официально поддерживает средства программного доступа  к данным из языков:

  • C
  • C++
  • C#
  • Go
  • Erlang
  • Java
  • JavaScript
  • Node.js
  • Perl
  • PHP
  • Python
  • Ruby
  • Scala

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

Цель - обеспечить и проверить возможность работы с MongoDB из Delphi XE5 - функционирующей в среде Windows платформы создания приложений для разных типов устройств и сред исполнения ПО.

Библиотеки и драйвера

Сообщество разработчиков MongoDB предоставляет три варианта драйверов/библиотек доступа к MongoDB из Delphi.

  • mongo-delphi-driver - Full featured Delphi interface to MongoDB built on top of the mongodb.org supported C driver
  • pebongo - Early stage Delphi driver for MongoDB
  • TMongoWire - Maps all the VarTypes of OleVariant to the BSON types, implements IPersistStream for (de)serialization, and uses TTcpClient for networking

Самым "свежим" является первый, построенный на базе актуальной библиотеки для языка C. Им и воспользуемся. Остальные выглядят "заброшенными".

Сборка и инсталляция

Исходные тексты драйвера и библиотек находятся по ссылке https://github.com/gerald-lindsly/mongo-delphi-driver в свободном доступе (Apache License, Version 2.0). В  репозиторий также включен архив с исходными текстами для mongo-c-driver, лучше скачать более свежую версию непосредственно с GitHub. Была скачана версия mongo-c-driver 0.8.1

README.md

This is a Delphi package supporting access to MongoDB. After downloading this repo, download and build mongo-c-driver with scons. Use the --m32 option with SCons to generate a 32-bit dll. Copy the produced mongoc.dll to C:\10gen\mongo-delphi-driver\Win32\Debug or ...\Release as appropriate. Load the project group, MongoDelphiDriver.groupproj, into RAD Studio. To run the examples, in the Project Manager, right-click on either Test.exe or AddressBook.exe and Activate. Hit F9 to build and run. The documentation for package is in the 3 unit files: MongoDB.pas, MongoBson.pas, and GridFS.pas

Согласно README.md подготовка библиотек и драйвера для Delphi состоит из трех этапов:

  1. Сборки и построения mongo-c-driver
  2. Размещения построенной библиотеки mongoc.dll в каталог, доступный из проекта на Delphi. Вызова и построения необходимых бинарников с помощью проекта MongoDelphiDriver.groupproj
  3. Тестирования результатов построения драйверов - набор тестов и пример программы, работающей с MongoDB

Mongoc.dll

Удивительное дело, но для того, чтобы собрать из исходных текстов на С двоичную библиотеку Mongoc.dll необходимо воспользоваться scons - инструментом для автоматизации сборки программных проектов, разработанный как замена утилиты make с интегрированной функциональностью аналогичной autoconf/automake. SCons использует язык Python в качестве основы, поэтому конфигурация проектов и инструменты для управления процессом сборки являются сценариями на Python. Для работы этого инструмента надо установить среду Python 2.7.

Но этого тоже не достаточно. В какой-то момент построения библиотеки Scons потребовал наличия MS Visual Studio на ПК, где выполняется сборка.

Для построения 32-битной библиотеки нельзя опускать опцию -m32 при запуске scons.

Если библиотека Mongoc.dll, точно соответствующая возможностям имеющейся версии ядра MongoDB, уже есть в наличии, все эти сложности со сборкой этой библиотеки из исходных текстов можно пропустить.

MongoDB и MongoBSON

Открыть проект (точнее группу проектов) MongoDelphiDriver.groupproj в среде Delphi или RAD Studio. Выставить соответствующую платформу для сборки.  Выполнить Build для MongoDelphiDriver.bpl.  Разместить полученную BPL в каталог вместе с остальными общими библиотеками. Заняло около минуты времени.

Тестирование

Теперь можно провести тестирование работоспособности  драйвера. Необходимо наличие запущенного MongoD на этом же ПК. Адрес доступа к нему тестового приложения должен быть http://localhost:27017 (стандартный).

Сначала собирается консольное тестовое приложение Test.exe. Активировать этот проект и сделать ему Build. Открыть окно CMD и сменить рабочий каталог на тот, куда был помещен исполняемый файл TEST.EXE. Запустить  TEST.EXE в этом окне и наблюдать за выдаваемыми результатами тестирования. У меня выполнение этого теста закончилось без ошибок.

Собрать и запустить пример приложения с доступом к БД MongoDB. Это проект AddressBook.dproj

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

Проект будет работать с сервером MongoDB, доступном по стандартному локальному адресу и порту http://localhost:27017, с БД по имени "test" с коллекцией "addresses".

Команда Run (или Run Without Debugging) сначала запускает компиляцию и сборку приложения (1 warning, 2 hints), затем начинает выполнение прямо с подключения к MongoDB. В моем случае проблем не наблюдалось, приложение успешно соединилось с сервером MongoDB и выполняло все предусмотренные операции.

В обоих этих приложениях (TEST.EXE и AddressBook.EXE) стандартные компоненты Delphi для доступа к данным  не использовались.

Итоги

Собрать и сделать рабочим выбранный драйвер для доступа к MongoDB из Delphi XE5 удалось с минимальными усилиями.

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

На основании всего этого можно сделать вывод о существовании реального пути работы с MongoDB из Delphi  и C++ Builder.

Использование стандартных компонент доступа к данным является предметом дальнейшего исследования и следующего поста


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=35633