Данный проект демонстрирует работу трех модулей: база данных (Modules/DB), парсер (Modules/Parse) и сервер (Modules/Server).
Для работы программы требуются следующие библиотеки: boost (boost::asio), bison и flex. Для сборки используется cmake и make. Используется стандарт c++11. Если вы используете дистрибутив ubuntu или debian, то установка весьма проста:
sudo apt-get install flex bison cmake libboost-all-dev
Далее программу нужно собрать. Перейдите в директорию с проектом и выполните:
mkdir build && cd build
cmake ..
make
В качестве примера я использую базу данных студентов. Для хранения используется формат CSV, данные загружаются в память и хранятся в объекте std::set, который представляет из себя самобалансирующееся дерево. У объекта базы данных прописаны основные запросы для работы с ней. Они реализуют обертку над методами объекта std::set. Для хранения данных используется объект Student, который хранит поля first_name (Имя), last_name (Фамилия), group (Группа) и course (Курс), settled (Поселен ли студент), city (Город). Для генерации примера базы данных написан генератор. Для запуска используйте команду:
./generator students.csv
или
./generator students.csv 1000
Число задает количество записей.
Парсер выполнен с использованием программ flex и bison и способен распозновать корректные для него скрипты. Скрипт состоит из команд, разделенных точками с запятой. Каждая команда начинается с операции (select, insert, delete), далее идут параметры (first_name, last_name, group, settled, city) со своими значениями указанными через =. То есть для того, чтобы получить всех студентов из группы 210, нужно написать:
select group = 210;
Пробельные символы игнорируются. Для того, чтобы вывести всех, вместо параметров указывается ключевое слово all:
select all;
Insert требует всех параметров, в связи с чем insert all; работать не будет. Delete работает аналогично select.
delete all;
delete group=210 first_name = Изя;
Для того, чтобы запустить парсер, используйте команду:
./parser students.csv test_simple.dbq
Где test_simple.dbq представляет из себя простой скрипт:
select all;
Сервер реализован с применением boost::asio. Сервер является асинхронным и способен поддерживать несколько подключений. Для остановки сервера просто напишите stop в консоли. Сервер для каждого подключения создает свой интерпретатор, загружает туда запрос и возвращает клиенту ответ. Клиент подключается к серверу и отправляет запрос (Запрос отправляется только тогда, когда ввод закончен. В консоли это Ctrl+D, для файла это EOF). Как только запрос отправлен, программа ловит ответ и завершает работу. Для того, чтобы протестировать сервер и клиент, запустите сначала сервер:
./server students.csv 4444
А потом клиент:
./client 127.0.0.1 4444
В клиент можно сразу передать файл скрипта:
./client 127.0.0.1 4444 < test_simple.dbq