Задача приложения - реализовать простое key-value хранилище, взаимодействие через подключение по tcp. Программа должна позволять подключаться ограниченному количеству клиентов (можно через конфигурацию, но проще будет передавать ограничение как опцию запуска). Формат протокола взаимодействия: каждая команда передается в одной строке, завершается символом LF (0x0A) либо комбинацией CR LF (0x0D 0x0A), ответ на каждую команду также в одной строке.
Общий формат команды: <команда> [ключ] [значение]
В качестве ключа рассматривается строка alpha-numeric (символы 0-9 и a-z, A-Z), регистр имеет значение.
Поддерживаемые команды:
- PUT - запоминает значение для ключа
- GET - получает значение для ключа
- DEL - удаляет значение по ключу
- COUNT - количество ключей
- DUMP - запись содержимого базы данные в файл
Общий формат ответа: <статус> [значение]
Также поддерживается ввод команд в нижнем регистре: put, get, del, count, dump
Пример сценария:
PUT name Vasya
OK
PUT name Masha
OK Vasya // возвращает предыдущее значение
GET name
OK Masha // текущее значение Masha
GET age
NE // ключа нет
PUT age 20
OK
GET age
OK 20
COUNT
OK 2 // 2 ключа
DEL age
OK 20
DEL name
OK Masha
COUNT
OK 0 // нет ключей
DEL name
NE // ошибка, ключа нет
Порт для прослушивания нужно указывать либо в опциях запуска, либо в своем отдельном файле конфигурации. Лучше использовать опции запуска. Делать реализацию многопоточной или все делать в одном потоке - оставляем на усмотрение автора.
Для сборки необходимо установить boost (1.76 и новее, из-за использования корутин) и oneTBB.
mkdir build && cd build
cmake ../
cmake --build .
Для сборки документации необходимо установить doxygen. Тогда из директории build:
cmake --build . --target docs
Сборка приложения также возможна с использованием docker:
docker build -t turnipdb https://github.com/TheShenk/protei-turnip-db.git#main
docker run -p 31415:31415 turnipdb
При использовании docker могут возникнуть сложности с проверкой функции выгрузки и загрузки базы данных из файла, так как все файлы создаются и берутся из контейнера.
./tests
- запуск тестов
./turnip-server
- запуск базы данных, порт по умолчанию - 31415
nc 127.0.0.1 31415
- подключение с помощью NetCat к базе данных для ввода команд.
Аргументы командной строки для настройки:
-
./turnip-server --help
- вывод сообщения с описанием параметров -
./turnip-server --port 31415
- указание порта, на котором ожидать новых подключений -
./turnip-server --max-clients 1
- указание максимального числа одновременно подключенных клиентов -
./turnip-server --dump dumpfile
- указание файла, из которого будет прочитано содержимое базы данных -
./turnip-server --log [trace|debug|info|warning|error|fatal]
- указание минимального уровня выводимых сообщений -
./turnip-server --threads 4
- указание числа используемых потоков