EJDB — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
(Работа с EJDB)
(не показаны 4 промежуточные версии этого же участника)
Строка 109: Строка 109:
  
 
== Работа с EJDB ==
 
== Работа с EJDB ==
В данном разделе приводятся необходимые действия для установки библиотеки для работы с базой данных EJDB на разных платформах (macOS / OSX, Linux Ubuntu / Debian, Windows), а также пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языках программирования C, JavaScript (Node.js), Java, Dart и Swift. Наиболее подробно рассмотрен вариант запуска приложения на языке Java с библиотекой EJDB на платформе macOS.  
+
В данном разделе приводятся необходимые действия для установки библиотеки для работы с базой данных EJDB на разных платформах ([[macOS]] / OSX, [[Linux]] [[Ubuntu]] / [[Debian]], [[Windows]]), а также пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языках программирования [[C]], [[JavaScript]] ([[Node.js]]), [[Java]], Dart и Swift. Наиболее подробно рассмотрен вариант запуска приложения на языке Java с библиотекой EJDB на платформе macOS.  
  
'''1. Установка библиотеки для работы с базой данных EJDB'''
+
===Установка библиотеки для работы с базой данных EJDB===
  
'''1.1. macOS / OSX'''
+
====macOS / OSX====
  
 
Для работы с библиотекой из терминала достаточно воспользоваться командой:
 
Для работы с библиотекой из терминала достаточно воспользоваться командой:
Строка 119: Строка 119:
 
Здесь используется менеджер пакетов для macOS - Homebrew, установка которого также выполняется одной командой:
 
Здесь используется менеджер пакетов для macOS - Homebrew, установка которого также выполняется одной командой:
 
<console>##i##% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"##!i##</console>
 
<console>##i##% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"##!i##</console>
Также доступны другие способы установки Homebrew, которые описаны на официальном сайте https://brew.sh/index_ru
+
Также доступны другие способы установки Homebrew, которые описаны на официальном сайте <ref  group="Источник"> Homebrew // Установка Homebrew [2009-2020]. Дата обновления: 24.06.2020. URL: https://brew.sh/index_ru (дата обращения: 22.06.2020).</ref>
 
Установка библиотеки для ее использования в коде выполняется следующими командами:
 
Установка библиотеки для ее использования в коде выполняется следующими командами:
 
<console>##i##% git clone https://github.com/Softmotions/ejdb.git##!i##
 
<console>##i##% git clone https://github.com/Softmotions/ejdb.git##!i##
Строка 126: Строка 126:
 
##i##cmake .. -DBUILD_JNI_BINDING=ON -DCMAKE_BUILD_TYPE=Release##!i##
 
##i##cmake .. -DBUILD_JNI_BINDING=ON -DCMAKE_BUILD_TYPE=Release##!i##
 
##i##make##!i##</console>
 
##i##make##!i##</console>
На рисунке 1 изображен результат установки библиотеки. Из рисунка 1 видно, что в ходе выполнения команд был скомпилирован файл ejdb2jni-2.0.50.jar и создан ярлык ejdb2jni.jar с ссылкой на данный файл.
+
На рисунке 1 изображен результат установки библиотеки. Из рисунка 1 видно, что в ходе выполнения команд был скомпилирован файл <code>ejdb2jni-2.0.50.jar</code> и создан ярлык <code>ejdb2jni.jar</code> с ссылкой на данный файл.
 
[[Файл:Рис 1.jpg|650px|thumb|center|{{center|Рисунок 1 – Результат установки библиотеки EJDB на платформе macOS}}]]
 
[[Файл:Рис 1.jpg|650px|thumb|center|{{center|Рисунок 1 – Результат установки библиотеки EJDB на платформе macOS}}]]
  
'''1.2. Linux Ubuntu / Debian'''
+
====Linux Ubuntu / Debian====
  
 
Для работы с библиотекой из терминала необходимо добавить персональный архив пакетов (PPA) данной библиотеки и установить ее из этого пакета. Для этого нужно выполнить следующие команды:
 
Для работы с библиотекой из терминала необходимо добавить персональный архив пакетов (PPA) данной библиотеки и установить ее из этого пакета. Для этого нужно выполнить следующие команды:
Строка 145: Строка 145:
 
##i##$ make package##!i##</console>
 
##i##$ make package##!i##</console>
  
'''1.3. Windows'''
+
====Windows====
  
Библиотека может быть установлена с использованием кроссплатформенной системы автоматизации сборки программного обеспечения из исходного кода - CMake, согласно https://github.com/Softmotions/ejdb/blob/master/WINDOWS.md. Однако наиболее простым способом является развертывание библиотеки с помощью программного обеспечения для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации - Docker. Для этого необходимо установить само программное обеспечение Docker, скачав установщик с официального сайта https://www.docker.com/products/docker-desktop и проследовав стандартным пунктам установки. Затем достаточно скачать образ с сайта Docker Hub https://hub.docker.com/r/softmotions/ejdb2, выполнив команду:
+
Библиотека может быть установлена с использованием кроссплатформенной системы автоматизации сборки программного обеспечения из исходного кода - CMake, согласно описанию установки библиотеки EJDB на платформе Windows из официального репозитория [[GitHub]]  <ref  group="Источник"> GitHub // Описание установки библиотеки EJDB на платформе Windows. Дата обновления: 24.06.2020. URL: https://github.com/Softmotions/ejdb/blob/master/WINDOWS.md (дата обращения: 23.06.2020).</ref>. Однако наиболее простым способом является развертывание библиотеки с помощью программного обеспечения для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации - [[Docker]]. Для этого необходимо установить само программное обеспечение Docker, скачав установщик с официального сайта <ref  group="Источник"> Docker // Docker Desktop
 +
The fastest way to containerize applications on your desktop [2013-2020]. Дата обновления: 25.06.2020. URL:https://www.docker.com/products/docker-desktop (дата обращения: 23.06.2020).</ref> и проследовав стандартным пунктам установки. Затем достаточно скачать образ с сайта Docker Hub <ref  group="Источник"> Docker Hub // softmotions/ejdb2. Дата обновления: 24.06.2020. URL:https://hub.docker.com/r/softmotions/ejdb2 (дата обращения: 23.06.2020).</ref>, выполнив команду:
 
<console>##i##> docker pull softmotions/ejdb2##!i##</console>
 
<console>##i##> docker pull softmotions/ejdb2##!i##</console>
 
Для запуска библиотеки через докер используется следующая команда:
 
Для запуска библиотеки через докер используется следующая команда:
 
<console>##i##> docker run ejdb2##!i##</console>
 
<console>##i##> docker run ejdb2##!i##</console>
  
'''2. Пример приложения для работы с базой данных EJDB'''
+
===Пример приложения для работы с базой данных EJDB===
  
'''2.1. Язык программирования C'''
+
====Язык программирования C====
  
 
Для работы с библиотекой из кода на C в среде разработки, например, Visual Studio необходимо указать пути к файлам библиотеки в настройках.  
 
Для работы с библиотекой из кода на C в среде разработки, например, Visual Studio необходимо указать пути к файлам библиотеки в настройках.  
Строка 230: Строка 231:
 
</source>  
 
</source>  
  
'''2.2. Язык программирования JavaScript (Node.js)'''
+
====Язык программирования JavaScript (Node.js)====
  
 
Необходимо предварительно установить пакет для Node.js следующей командой:
 
Необходимо предварительно установить пакет для Node.js следующей командой:
 
<console>##i##> yarn add ejdb2_node##!i##</console>
 
<console>##i##> yarn add ejdb2_node##!i##</console>
В данной команде используется пакетный менеджер Yarn, установка которого описана на официальном сайте https://yarnpkg.com/.
+
В данной команде используется пакетный менеджер Yarn, установка которого описана на официальном сайте <ref  group="Источник"> Yarn // Yarn Home Page. Дата обновления: 05.09.2019. URL:https://yarnpkg.com/ (дата обращения: 25.06.2020).</ref>.
 
Ниже представлен пример приложения  для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языке программирования JavaScript (Node.js).
 
Ниже представлен пример приложения  для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языке программирования JavaScript (Node.js).
 
<source lang='javascript'>
 
<source lang='javascript'>
Строка 260: Строка 261:
 
</source>
 
</source>
  
'''2.3. Язык программирования Java'''
+
====Язык программирования Java====
  
Для работы с библиотекой из кода на Java в среде разработки, например, IntelliJ IDEA необходимо указать пути к файлам библиотеки в настройках. Для этого нужно перейти в раздел Project Structure -> Libraries и добавить путь к файлу ejdb2jni-2.0.50.jar, который был получен при компиляции библиотеки. На рисунке 2 представлен пример подключения библиотеки в IntelliJ IDEA.
+
Для работы с библиотекой из кода на Java в среде разработки, например, IntelliJ IDEA необходимо указать пути к файлам библиотеки в настройках. Для этого нужно перейти в раздел Project Structure, а в нем - в раздел Libraries и добавить путь к файлу <code>ejdb2jni-2.0.50.jar</code>, который был получен при компиляции библиотеки. На рисунке 2 представлен пример подключения библиотеки в IntelliJ IDEA.
 
[[Файл:Рис2.jpg|650px|thumb|center|{{center|Рисунок 2 – Пример подключения библиотеки EJDB в IntelliJ IDEA}}]]
 
[[Файл:Рис2.jpg|650px|thumb|center|{{center|Рисунок 2 – Пример подключения библиотеки EJDB в IntelliJ IDEA}}]]
 
Для запуска самого приложения не из терминала, а напрямую из среды разработки требуется создать конфигурацию с указанием путей к папке со скомпилированной библиотекой, а также к самой библиотеке. На рисунке 3 представлен пример конфигурации.
 
Для запуска самого приложения не из терминала, а напрямую из среды разработки требуется создать конфигурацию с указанием путей к папке со скомпилированной библиотекой, а также к самой библиотеке. На рисунке 3 представлен пример конфигурации.
Строка 294: Строка 295:
 
[[Файл:Рис 4.jpg|650px|thumb|center|{{center|Рисунок 4 – Результат работы приложения на Java для работы с EJDB из IntelliJ IDEA}}]]
 
[[Файл:Рис 4.jpg|650px|thumb|center|{{center|Рисунок 4 – Результат работы приложения на Java для работы с EJDB из IntelliJ IDEA}}]]
  
'''2.4. Язык программирования Dart'''
+
====Язык программирования Dart====
  
 
Пример приложения на языке программирования Dart также может быть запущен в среде разработки IntelliJ IDEA.
 
Пример приложения на языке программирования Dart также может быть запущен в среде разработки IntelliJ IDEA.
Строка 317: Строка 318:
 
</source>
 
</source>
  
'''2.5. Язык программирования Swift'''
+
====Язык программирования Swift====
 
<source lang='swift'>
 
<source lang='swift'>
 
import EJDB2
 
import EJDB2

Версия 12:11, 1 июля 2020

EJDB
Ejdb-2.png
Создатели: Антон Адаманский
Разработчики:

группа программистов во главе с Антоном Адаманским

Россия
Выпущена: 2012 год (EJDB1.0)
Постоянный выпуск: 2.0 (Core) / апрель 2018 года
Состояние разработки: Активно
Написана на: Java
Операционная система: Windows Vista и позднее, Linux, macOS 10.7 и позднее, Android
Локализация: English
Тип ПО:

Встроенная база данных JSON

Объектно-ориентированная СУБД
Лицензия: MIT
Веб-сайт ejdb.org

EJDB (Embedded JSON DataBase engine) - это встроенная база данных JSON, основанная на модифицированной версии Tokyo Cabinet. EJDB нацелена на создание быстрой библиотеки, подобной MongoDB, которая может быть встроена в приложения C / C ++. [Источник 1] Он включает блокировку записи на уровне коллекции, транзакции на уровне коллекции, запросы на сопоставление с токеном строки и привязку Node.js. Представление JSON объектов, реализовано с помощью API на основе C BSON.

История

Основателем проекта стал разработчик и преподаватель НГУ Антон Адаманский[Источник 2]. Всё началось в 2011 году, изначально возникла идея о создании удобной системы хранения информации и поиска метатегов аудиофайлов для небольшого медиаплеера, написанной на C++. Но во время осуществления задуманного возникли следующие проблемы: реализация была слишком громоздкой ( SQLite ) или имела проблемы со стабильностью ( GigaBASE ); размер всего проекта составлял одну десятую от одного файла sqlite.c (тогда Антон не сравнивал размер проекта с ядром системы). Как говорил сам автор : "2011 год был золотым веком различных решений NoSQL". Помимо этого рассматривалась MongoDB, как возможное решение, но в процессе изучения выявились два существенными ограничения:

  1. Трудность использования MongoDB в качестве дополнительной DLL, потому что изначально ее разработчики не планировали такой вариант применения, а MongoDB технически не был готов к этому.
  2. MongoDB был под лицензией AGPL, что,на тот момент только вредило проекту. По словам Антона Адаманского AGPL ничего не приносит в мир открытого программного обеспечения и, как правило, было удобным прикрытием для коммерческих лицензированных продуктов с условно-бесплатным кодом.

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

  • Документно-ориентированность с возможностью хранения иерархии документов с произвольной структурой.
  • Поддержка коллекций документов JSON.
  • Реализовано на языке C99.
  • Бесплатная лицензия, которая позволяет использовать продукты с закрытым исходным кодом.

Вдохновившись MongoDB была создана система управления базами данных(в дальнейшем СУБД), реализованная в виде разделяемой библиотеки ( EJDB 1.0 ). EJDB 1.0 основан на модифицированной версии проекта TokyoCabinet,который на данный момент уже заброшен. EJDB стал довольно популярным на github [Источник 3] среди разработчиков со всего мира. Тогда один из менеджеров 10gen связался с разработчиками, чтобы обсудить совместимость запросов между EJDB и MongoDB, но после обсуждения вопросы о сотрудничестве больше не поступали.Однако разработчики взяли слишком много у MongoDB, что и стало проблемой, так к примеру, громоздкий формат поисковых запросов. Другим спорным элементом, взятым из MongoDB, стала функция, которая сохраняла первичный ключ документа в самом документе, как специальное поле _id, которое смешивает исходную структуру хранимого документа с реализацией системы хранения. Позднее TokyoCabinet, наложил лицензию LGPL 1.x на EJDB, которая является более свободной, чем AGPL, но все же ограничивает использование EJDB во многих проектах.Будучи немного разочарованными, разработчики выпустили несколько версий EJDB, а затем оставили его неактивным в течение нескольких лет. В 2018 году проанализировав современный IT рынок и технологии было принято решение о создании второй версии EJDB, главным девизом которой стал лозунг "Хватит Усложнять!". EJDB 2.0 полностью избавились от кода LGPL из TokyoCabinet. Исходный код стал полностью открытым благодаря использованию лицензии MIT для всех компонентов проекта. Для EJDB2 было разработано хранилище данных Key-value под лицензией MIT[Источник 4]. Описание хранилища iowow смотрите ниже.

Архитектура EJDB

Как говорилось ранее EJDB является встраиваемой кроссплатформенной документо-ориентированной (иерархической, в англоязычной литературе document-oriented)[Источник 5] СУБД для JSON данных, которая представлет собой разделяемую библиотеку для windows/linux платформ. Самые популярные СУБД для работы с JSON данными – это mongodb и couchdb, но они работают с использованием протокола TCP/IP. Такой подход очень удобен в реализации серверных приложений, однако не слишком пригоден для встраивания базы в легкие приложения, такие как мобильные приложения и проч., по следующим причинам:

  • скорость общения клиента с базой данных через протокол TCP/IP значительно медленнее, чем скорость того же общения, работающего через разделяемую память в адресном пространстве запущенного процесса;
  • во время развертывания программного продукта в конечной среде можно столкнуться с рядом препятствий. Эти трудности приходят из необходимости одновременного развертывания продукта с СУБД. Таким образом, мы должны установить систему управления базой данных как отдельный сетевой сервис. Эта конфигурация более сложная для поддержки, а также может создавать уязвимости в безопасности программы.

Основой EJDB является общая философия MongoDB и язык запросов этой СУБД. Реализация EJDB технически основывается на tokyocabinet 2 – хранилище данных типа ключ-значение, которое распространяется под лицензией LGPL (Lesser GNU Public License). Система хранения EJDB построена на низкоуровневых структурах данных, которые предоставляет tokyocabinet:

  • B+ дерево (tcbdb);
  • хеш-таблица, которая хранит записи вида ключ-значение (tchdb);
  • табличная база данных (tctdb)

Внутри EJDB JSON документы представлены как BSON (Binary JSON) объекты. Этот формат достаточно компактный и эффективный для хранения и обработки данных. EJDB хранит набор коллекций, где каждая коллекция содержит набор логически связанных документов JSON. Логически каждая коллекция EJDB – это табличная база данных tokyocabinet (tctdb), которая явлется хранилищем таблиц, не зависимых от схемы с записаннымданными в строки, разделенные на набор определенных пользователем колонок. Таблица структуры документа JSON, представлена ниже:

столбец первичного ключа cтолбец документа BSON столбец метаданных документа
Первичный ключ UUID 12 байт Тело документа BSON атрибуты безопасности документов, статистика доступа и т. д

Каждая строка таблицы разделена на три части: 24-битный уникальный идентификатор, тело документа в формате BSON и дополнительные метаданные документа. Если документы не содержат проиндексированные поля в процессе выполнения запроса, вся коллекция документов будет просканирована, и BSON-документы, чьи поля подошли к запросу, будут выбраны. Выбор документа по первичному ключу сводится к выборке записей данных с диска при помощи хэш-таблицы. Эта операция может быть выполнена достаточно быстро. EJDB-запросы определены как набор CRUD-операций с документами, хранящимися в коллекциях, т. е. создание, чтение, обновление и удаление. Правила CRUD представлены в виде набора BSON-документов, состав которых похож на запросы MongoDB. CRUD-операции чтения определяют набор ограничений на поля, применяемых к коллекции документов. Так как структура JSON-документов может быть иерархичной, то fieldpath используется для идентификации документа. Например, условие запроса на выбор книг с определенным издателем может быть таким: {"publisher.name" : "some publisher"}. EJDB стремится быть совместимой с MongoDB в плане запросов, так как это обеспечит возможность легкой миграции приложений из/в MongoDB. На данный момент около 70 % запросов mongodb реализованы в EJDB, планируется достигнуть совместимости по запросам в 90 %. Кроме того, EJDB расширяет возможности запросов MongoDB и предоставляет следующие возможности извлечения данных:

  • оптимизированное сравнение строк, не зависящее от регистра;
  • быстрое сравнение строк, например, запрос {"words" : {"$strand" : ["one", "two"]}} находит докумнты, где строковое поле words содержит слова «one» и «two» в наборе из слов,разделенных пробелами.
  • оптимизированный строковый префикс matching with "$begin";
  • соединение набора документов. Вхождения документов в различные коллекции могут

быть объединены с помощью первичного ключа, как результат одного запроса. Если разработчик захочет получить объединение объектов из связанных коллекций, ему придется исполнить как минимум N + 1 запрос, где N – это количество элементов основной коллекции. Для того чтобы ликвидировать эти тривиальные раунды, EJDB предлагает способ указатьобъединение как часть исполнения одного запроса в следующей формой: "{$do : {<fpath> :{$join : <collection name>}}}", где <fpath> – это путь к полю документа, содержащего идентификаторы объектов, которые будут объединены с другой коллекцией.

Iowow

Хранилище Iowow [Источник 6] может работать со многими базами данных «ключ-значение», хранящимися в одном файле, что упрощает передачу данных между устройствами и создание резервных копий, а также снижает вероятность несоответствий в данных находящихся в нём. Iowow основан на простой структуре данных - списке пропусков , что позволило нам создать гораздо более понятную реализацию постоянного хранилища с гораздо меньшей базой кода (по сравнению с деревом B + и деревом LSM) с высокой производительностью (в соответствии с тестами). Максимальный объем файла базы данных составляет 512 ГБ, что является следствием компромиссов при реализации однофайловой базы данных в списках пропуска. Документы, хранящиеся в коллекциях EJDB2, сериализуются в простом двоичном формате - Binn.

Структура данных EJDB

Физически EJDB [Источник 7] это:

  • Мета-файл в котором хранится информация об доступных коллекциях. Это табличная база tctdb.
  • Для каждой коллекции:
  • Мета-файл с данными об индексах коллекции и настройках коллекции (tctdb)
  • Файл c данными JSON объектов коллекции (tctdb)
  • Набор B-Tree индексов для полей JSON объектов (tcbdb)

JSON объекты в EJDB представлены в формате BSON (Binary JSON). Для работы с BSON используется несколько модифицированная версия BSON API из C драйвера mongodb (ссылка). Стоит заметить, что BSON очень эффективный формат для представления любых иерархических данных со строковыми ключами и типизированными значениями как с точки зрения удобства навигации так и производительности, и отлично может подойти для внутреннего представления данных в обычных С/C++ программах.

Записи в коллекции EJDB хранятся в табличной базе tctdb. База tctcdb является хеш-таблицей, где значение каждой записи это словарь в котором ключ (c1..cN) это имя колонки в таблице, и соответствующие им данные (v1..vN). Каждая запись в табличной базе может иметь свой набор колонок. Данные разных записей принадлежащие к колонкам с одинаковым именами могут быть проиндексированы в B+ дереве tcbdb ссылаясь на первичные ключи основной хеш таблицы.

В качестве первичных ключей используются уникальные двенадцатибайтные идентификаторы UUID для JSON объектов. Объекты сериализованные в BSON формат хранятся в колонке с кратким и звучным именем $. Подобная модель допускает возможность связи произвольной мета информации с записями коллекции, путем добавления новых колонок, например списков доступа (ACL) на уровне записей, или данных статистики доступа к записям, но оставим это для следующих релизов.

Какая требовалась функциональность от этой библиотеки:

  • Хранение коллекций JSON объектов
  • Mongodb-like запросы относительно коллекций
  • Поддержка транзакций на уровне коллекций
  • Связка с NodeJS

Что было использовано из tokyocabinet:

  • B+ деревья (tcbdb.h)
  • Хеш таблицы (tchdb.h)
  • Табличная база (tctdb.h)
  • Структуры данных и утилиты (tcutil.h)

В этом списке в скобках приведены ссылки на элементы api tokyocabinet. [Источник 8]

Работа с EJDB

В данном разделе приводятся необходимые действия для установки библиотеки для работы с базой данных EJDB на разных платформах (macOS / OSX, Linux Ubuntu / Debian, Windows), а также пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языках программирования C, JavaScript (Node.js), Java, Dart и Swift. Наиболее подробно рассмотрен вариант запуска приложения на языке Java с библиотекой EJDB на платформе macOS.

Установка библиотеки для работы с базой данных EJDB

macOS / OSX

Для работы с библиотекой из терминала достаточно воспользоваться командой:

% brew install ejdb

Здесь используется менеджер пакетов для macOS - Homebrew, установка которого также выполняется одной командой:

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Также доступны другие способы установки Homebrew, которые описаны на официальном сайте [Источник 9] Установка библиотеки для ее использования в коде выполняется следующими командами:

% git clone https://github.com/Softmotions/ejdb.git
cd ./ejdb
mkdir ./build && cd build
cmake .. -DBUILD_JNI_BINDING=ON -DCMAKE_BUILD_TYPE=Release
make

На рисунке 1 изображен результат установки библиотеки. Из рисунка 1 видно, что в ходе выполнения команд был скомпилирован файл ejdb2jni-2.0.50.jar и создан ярлык ejdb2jni.jar с ссылкой на данный файл.

Рисунок 1 – Результат установки библиотеки EJDB на платформе macOS

Linux Ubuntu / Debian

Для работы с библиотекой из терминала необходимо добавить персональный архив пакетов (PPA) данной библиотеки и установить ее из этого пакета. Для этого нужно выполнить следующие команды:

$ sudo add-apt-repository ppa:adamansky/ejdb2
$ sudo apt-get update
$ sudo apt-get install ejdb2

Установка библиотеки для ее использования в коде выполняется следующими командами:

  • Для Debian дистрибутивов:
$ mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DPACKAGE_DEB=ON
$ make package
  • Для дистрибутивов Linux на основе RPM
$ mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DPACKAGE_RPM=ON
$ make package

Windows

Библиотека может быть установлена с использованием кроссплатформенной системы автоматизации сборки программного обеспечения из исходного кода - CMake, согласно описанию установки библиотеки EJDB на платформе Windows из официального репозитория GitHub [Источник 10]. Однако наиболее простым способом является развертывание библиотеки с помощью программного обеспечения для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации - Docker. Для этого необходимо установить само программное обеспечение Docker, скачав установщик с официального сайта [Источник 11] и проследовав стандартным пунктам установки. Затем достаточно скачать образ с сайта Docker Hub [Источник 12], выполнив команду:

> docker pull softmotions/ejdb2

Для запуска библиотеки через докер используется следующая команда:

> docker run ejdb2

Пример приложения для работы с базой данных EJDB

Язык программирования C

Для работы с библиотекой из кода на C в среде разработки, например, Visual Studio необходимо указать пути к файлам библиотеки в настройках. Ниже представлен пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языке программирования C.

#include <ejdb2/ejdb2.h>

#define CHECK(rc_)          \
  if (rc_) {                 \
    iwlog_ecode_error3(rc_); \
    return 1;                \
  }

static iwrc documents_visitor(EJDB_EXEC *ctx, const EJDB_DOC doc, int64_t *step) {
  // Печать документа в поток stderr
  return jbl_as_json(doc->raw, jbl_fstream_json_printer, stderr, JBL_PRINT_PRETTY);
}

int main() {

  EJDB_OPTS opts = {
    .kv = {
      .path = "example.db",
      .oflags = IWKV_TRUNC
    }
  };
  EJDB db;     // EJDB2 объект хранилища
  int64_t id;  // идентификатор документа
  JQL q = 0;   // запрос
  JBL jbl = 0; // Json документ

  iwrc rc = ejdb_init();
  CHECK(rc);

  rc = ejdb_open(&opts, &db);
  CHECK(rc);

  // Запись в БД первого документа
  rc = jbl_from_json(&jbl, "{\"name\":\"Bianca\", \"age\":4}");
  RCGO(rc, finish);
  rc = ejdb_put_new(db, "parrots", jbl, &id);
  RCGO(rc, finish);
  jbl_destroy(&jbl);

  // Запись в БД второго документа
  rc = jbl_from_json(&jbl, "{\"name\":\"Darko\", \"age\":8}");
  RCGO(rc, finish);
  rc = ejdb_put_new(db, "parrots", jbl, &id);
  RCGO(rc, finish);
  jbl_destroy(&jbl);

  // Создание запроса
  rc =  jql_create(&q, "parrots", "/[age > :age]");
  RCGO(rc, finish);

  EJDB_EXEC ux = {
    .db = db,
    .q = q,
    .visitor = documents_visitor
  };

  rc = jql_set_i64(q, "age", 0, 3);
  RCGO(rc, finish);

  // Выполнение запроса
  rc = ejdb_exec(&ux);

finish:
  jql_destroy(&q);
  jbl_destroy(&jbl);
  ejdb_close(&db);
  CHECK(rc);
  return 0;
}

Язык программирования JavaScript (Node.js)

Необходимо предварительно установить пакет для Node.js следующей командой:

> yarn add ejdb2_node

В данной команде используется пакетный менеджер Yarn, установка которого описана на официальном сайте [Источник 13]. Ниже представлен пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языке программирования JavaScript (Node.js).

import { EJDB2 } from 'ejdb2_node';

async function run() {
  const db = await EJDB2.open('example.db', { truncate: true });

  var id = await db.put('parrots', {'name': 'Bianca', 'age': 4});
  console.log(`Bianca record: ${id}`);

  id = await db.put('parrots', {'name': 'Darko', 'age': 8});
  console.log(`Darko record: ${id}`);

  const q = db.createQuery('/[age > :age]', 'parrots');

  for await (const doc of q.setNumber('age', 3).stream()) {
    console.log(`Found ${doc}`);
  }

  await db.close();
}

run();

Язык программирования Java

Для работы с библиотекой из кода на Java в среде разработки, например, IntelliJ IDEA необходимо указать пути к файлам библиотеки в настройках. Для этого нужно перейти в раздел Project Structure, а в нем - в раздел Libraries и добавить путь к файлу ejdb2jni-2.0.50.jar, который был получен при компиляции библиотеки. На рисунке 2 представлен пример подключения библиотеки в IntelliJ IDEA.

Рисунок 2 – Пример подключения библиотеки EJDB в IntelliJ IDEA

Для запуска самого приложения не из терминала, а напрямую из среды разработки требуется создать конфигурацию с указанием путей к папке со скомпилированной библиотекой, а также к самой библиотеке. На рисунке 3 представлен пример конфигурации.

Рисунок 3 – Пример конфигурации для запуска приложения на Java для работы с EJDB из IntelliJ IDEA

Ниже представлен пример приложения для подключения к базе данных EJDB, ее заполнения простым набором данных и поиска записей среди них, написанного на языке программирования Java.

package com.softmotions.ejdb2.example;

import com.softmotions.ejdb2.EJDB2;
import com.softmotions.ejdb2.EJDB2Builder;

public class EJDB2Example {

    public static void main(String[] args) {
        try (EJDB2 db = new EJDB2Builder("example.db").truncate().open()) {
            long id = db.put("parrots", "{\"name\":\"Bianca\", \"age\": 4}");
            System.out.println("Bianca record: " + id);

            id = db.put("parrots", "{\"name\":\"Darko\", \"age\": 8}");
            System.out.println("Darko record: " + id);

            db.createQuery("@parrots/[age > :age]").setLong("age", 3).execute((docId, doc) -> {
                System.out.println(String.format("Found %d %s", docId, doc));
                return 1;
            });
        }
    }
}

На рисунке 4 представлен результат работы приложения.

Рисунок 4 – Результат работы приложения на Java для работы с EJDB из IntelliJ IDEA

Язык программирования Dart

Пример приложения на языке программирования Dart также может быть запущен в среде разработки IntelliJ IDEA.

import "package:ejdb2_dart/ejdb2_dart.dart";

void main() async {
  final db = await EJDB2.open('example.db', truncate: true);

  var id = await db.put('parrots', {'name': 'Bianca', 'age': 4});
  print('Bianca record: ${id}');

  id = await db.put('parrots', {'name': 'Darko', 'age': 8});
  print('Darko record: ${id}');

  final q = db.createQuery('/[age > :age]', 'parrots');
  await for (final doc in q.setInt('age', 3).execute()) {
    print('Found $doc');
  }
  await db.close();
}

Язык программирования Swift

import EJDB2

let db = try EJDB2Builder("example.db").withTruncate().open()

var id = try db.put("parrots", ["name": "Bianca", "age": 4])
print("Bianca record: \(id)")

id = try db.put("parrots", ["name": "Darko", "age": 8])
print("Bianca record: \(id)")

try db.createQuery("@parrots/[age > :?]").setInt64(0, 3).list().forEach({
  print("Found \($0)")
})

try? db.close()

Использование EJDB

  • Softmotions платформа для торговых роботов
  • Gimme - социальная игра для обмена токенами мобильного приложения. EJDB2 используется как на стороне мобильного телефона, так и на стороне сервера. Где достаточно часто требуется соблюдение конфиденциальности хранимых данных от неавторизованного доступа. [Источник 14]

Источники

  1. EJDB — Embedded JSON Database engine // Встроенный JSON Database Engine. URL: https://www.findbestopensource.com/product/ejdb (дата обращения: 12.06.2020).
  2. It is 2011: popularization of NoSQL // The Story of the IT-depression, birds and EJDB 2.0. URL: https://medium.com/@adamansky/ejdb2-41670e80897c (дата обращения: 16.06.2020).
  3. Softmotions/ejdb // Github. Дата обновления: 16.05.2020. URL: https://github.com/Softmotions/ejdb (дата обращения: 13.06.2020).
  4. C11 key/value database engine // Supported platforms. URL: https://iowow.io/ (дата обращения: 13.06.2020).
  5. Архитектура EJDB // РЕАЛИЗАЦИЯ ШИФРОВАНИЯ ДАННЫХ ВО ВСТРАИВАЕМОЙ СУБД EJDB. Дата обновления: 08.11.2018: URL: https://nsu.ru/xmlui/bitstream/handle/nsu/3805/2014_V12_No2_6.pdf (дата обращения: 15.06.2020).
  6. // Features // C11 key/value database engine. URL: https://iowow.io (дата обращения: 23.06.2020).
  7. Структура данных EJDB // Обзор библиотеки хранения JSON данных EJDB. Дата обновления: 22.11.2012. URL: https://habr.com/ru/sandbox/52301/ (дата обращения: 22.06.2020).
  8. Что было использовано из tokyocabinet // Обзор библиотеки хранения JSON данных EJDB. Дата обновления: 22.11.2012. URL: https://habr.com/ru/sandbox/52301/ (дата обращения: 22.06.2020).
  9. Homebrew // Установка Homebrew [2009-2020]. Дата обновления: 24.06.2020. URL: https://brew.sh/index_ru (дата обращения: 22.06.2020).
  10. GitHub // Описание установки библиотеки EJDB на платформе Windows. Дата обновления: 24.06.2020. URL: https://github.com/Softmotions/ejdb/blob/master/WINDOWS.md (дата обращения: 23.06.2020).
  11. Docker // Docker Desktop The fastest way to containerize applications on your desktop [2013-2020]. Дата обновления: 25.06.2020. URL:https://www.docker.com/products/docker-desktop (дата обращения: 23.06.2020).
  12. Docker Hub // softmotions/ejdb2. Дата обновления: 24.06.2020. URL:https://hub.docker.com/r/softmotions/ejdb2 (дата обращения: 23.06.2020).
  13. Yarn // Yarn Home Page. Дата обновления: 05.09.2019. URL:https://yarnpkg.com/ (дата обращения: 25.06.2020).
  14. Введение // РЕАЛИЗАЦИЯ ШИФРОВАНИЯ ДАННЫХ ВО ВСТРАИВАЕМОЙ СУБД EJDB. URL: https://nsu.ru/xmlui/bitstream/handle/nsu/3805/2014_V12_No2_6.pdf (дата обращения: 17.06.2020).