diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5dd8fb2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,699 @@
+
+
+
+
+
+
+
+
+
+ +
(К началу)
+ +## Лицензия + +(К началу)
+ +## Глоссарий + +(К началу)
+ +## Типы данных субд + +СУБД реализует три основных типа данных: +- **Таппл (Tapple)** - аналог базы данных в РСУБД +- **Слайс (Slice)** - аналог таблицы +- **Кортеж (Tuple)** - аналог записи в таблице + +(К началу)
+ +## Системные требования + +> [!WARNING] +> - Процессор: Intel или AMD +> - Оперативная память: 4ГБ (Для Linux) 8ГБ (Для Illumos sytems) +> - Только Unix-подобная ОС (Solaris, OpenIndiana, Linux) +> - Go 1.25.6 или выше + +> [!CAUTION] +> **Важно: Windows и MacOS X не поддерживаются!** + +(К началу)
+ + +## Подготовка и компиляция + +1. Клонируйте репозиторий: + +```bash +git clone https://github.com/futriis/db.git +cd futriis +``` + +2. Скомпилируйте и запустите: + +```bash +./build.sh +./futriis +``` +(К началу)
+ + +**Пример использования демона "futriisd"** + +```bash + # Запуск узла кластера +./futriisd --config /path/to/config.toml --node-id node-1 + +# Запуск координатора +./futriisd --config /path/to/config.toml --coordinator + +# Запуск в фоновом режиме +./futriisd --daemon +``` + +### Тестирование + +(К началу)
+ + +### Примеры команд субд + +```bash +# Создать таппл (базу данных) +create tapple users + +# Создать слайс (таблицу) в таппле +create slice users user_profiles + +# Создать кортеж (запись) с полями +create tuple users user_profiles user1 name=John age=30 email=john@example.com +create tuple users user_profiles user2 name=Jane age=25 city=NYC +``` +(К началу)
+ +#### Просмотр списков + +```bash +# Показать все тапплы +list tapples + +# Показать все слайсы в таппле +list slices users + +# Показать все кортежи в слайсе +show tuples users user_profiles +``` +#### Обновление и удаление + +```bash +# Обновить поля кортежа +update tuple users user_profiles user1 age=31 city=Boston + +# Удалить кортеж +delete tuple users user_profiles user2 + +# Удалить слайс +delete slice users user_profiles + +# Удалить таппл +delete tapple users +``` +(К началу)
+ +## Индексы + +```bash +# Создать первичный индекс для таппла +add.prime.index users + +# Удалить первичный индекс +delete.prime.index users + +# Создать вторичный индекс по полю +add.secondary.index users email +add.secondary.index users age + +# Удалить вторичный индекс +delete.secondary.index users email +``` +(К началу)
+ +## Транзакции + +```bash +# Начать транзакцию +begin + +# Выполнить операции внутри транзакции +create tuple users user_profiles user3 name=Bob age=28 +update tuple users user_profiles user1 city=Chicago + +# Зафиксировать транзакцию +commit + +# Или откатить транзакцию +rollback +``` +(К началу)
+ + +## Кластеризация и шардинг + +```bash +# Показать статус кластера +cluster.status + +# Добавить узел в кластер +add.node 192.168.1.101:8080 +add.node 192.168.1.102:8080 + +# Удалить узел из кластера +evict.node node-123 + +# Ребалансировка кластера +cluster.rebalance + +# Показать статус шардинга +sharding.status +``` +(К началу)
+ +## Сжатие данных + +```bash +# Показать статистику сжатия по колонкам +compression.stats +``` +(К началу)
+ +## AOF (Append-Only File) + +```bash +# Показать информацию о AOF файле +aof.info + +# Восстановить данные из AOF файла +aof.recover +aof.recover /path/to/custom/file.aof +``` +(К началу)
+ +## Lua-плагины + +```bash +# Выполнить Lua плагин +lua my_plugin +lua analytics_script +``` +(К началу)
+ +## ACL-списки доступа + +**Настройка пользователей и прав** + +```bash +# Запускаем клиент СУБД +./futriis + +# Входим как администратор (по умолчанию admin/admin) +futriis:~> login admin admin +# Output: Logged in as: Administrator (admin) + +# Создаём новую базу данных (таппл) +futriis:~> create tapple company +# Output: Tapple 'company' created successfully + +# Создаём таблицу (слайс) +futriis:~> create slice company employees +# Output: Slice 'employees' in tapple 'company' created successfully + +# Создаём пользователей с разными ролями +futriis:~> acl.createuser john "John Doe" johnpass user +# Output: User created: John Doe (john) + +futriis:~> acl.createuser jane "Jane Smith" janepass readonly +# Output: User created: Jane Smith (jane) + +futriis:~> acl.createuser bob "Bob Wilson" bobpass user +# Output: User created: Bob Wilson (bob) + +# Проверяем права пользователей +futriis:~> acl.check john read company +# Output: Permission DENIED + +# Предоставляем права на чтение таппла john'у +futriis:~> acl.grant john read tapple company +# Output: Permission granted + +# Проверяем снова +futriis:~> acl.check john read company +# Output: Permission GRANTED + +# Даём bob'у права на запись в конкретный слайс +futriis:~> acl.grant bob write slice company.employees +# Output: Permission granted + +# Проверяем права bob'а +futriis:~> acl.check bob write company.employees +# Output: Permission GRANTED +``` + +**Пример тестирование разных уровней доступа** + +```bash +# Входим как john (только чтение таппла company) +futriis:~> login john johnpass +# Output: Logged in as: John Doe (john) + +# Пробуем создать данные (должно быть отказано) +futriis:~> create tuple company employees emp1 name=John age=30 +# Output: permission denied: you don't have write permission on slice 'company.employees' + +# Просмотр данных (разрешено) +futriis:~> list tapples +# Output: List of tapples: +# company + +futriis:~> list slices company +# Output: List of slices in tapple 'company': +# employees + +# Входим как bob (имеет права на запись в employees) +futriis:~> login bob bobpass +# Output: Logged in as: Bob Wilson (bob) + +# Создаём данные (разрешено) +futriis:~> create tuple company employees emp1 name=Bob age=25 department=IT +# Output: Tuple 'emp1' in slice 'employees' created successfully + +# Пробуем удалить (должно быть отказано, т.к. у bob'а нет прав на удаление) +futriis:~> delete tuple company employees emp1 +# Output: permission denied: you don't have delete permission on tuple 'company.employees.emp1' + +# Входим как jane (только чтение) +futriis:~> login jane janepass +# Output: Logged in as: Jane Smith (jane) + +# Просмотр данных (разрешено) +futriis:~> show tuples company employees +# Output: List of tuples in slice 'employees': +# ID: emp1 +# name: Bob +# age: 25 +# department: IT + +# Пытаемся изменить (должно быть отказано) +futriis:~> update tuple company employees emp1 age=26 +# Output: permission denied: you don't have write permission on tuple 'company.employees.emp1' + +# Возвращаемся к администратору и назначаем роли +futriis:~> login admin admin +# Output: Logged in as: Administrator (admin) + +# Назначаем jane роль user (даёт права на запись) +futriis:~> acl.assignrole jane user +# Output: Role assigned + +# Теперь jane может создавать данные +futriis:~> login jane janepass +# Output: Logged in as: Jane Smith (jane) + +futriis:~> create tuple company employees emp2 name=Jane age=28 department=HR +# Output: Tuple 'emp2' in slice 'employees' created successfully + +# Просматриваем оба кортежа +futriis:~> show tuples company employees +# Output: List of tuples in slice 'employees': +# ID: emp1 +# name: Bob +# age: 25 +# department: IT +# +# ID: emp2 +# name: Jane +# age: 28 +# department: HR +``` + +**Управление ролями и правами** + +```bash +# Создаём новую роль с ограниченными правами +futriis:~> login admin admin + +# В текущей реализации создание роли через API пока не добавлено, +# но можно использовать существующие роли + +# Просмотр прав пользователей +futriis:~> acl.check admin admin tapple +# Output: Permission GRANTED + +# Отзываем роль у пользователя +futriis:~> acl.revokerole jane user +# Output: Role revoked + +# Теперь jane вернулась к роли readonly +futriis:~> login jane janepass +futriis:~> create tuple company employees emp3 name=Test age=99 +# Output: permission denied: you don't have write permission on slice 'company.employees' +``` +(К началу)
+ +## HTTP API + +```bash +# Проверка здоровья сервера +curl http://localhost:9080/health +# Response: {"status":"ok","time":"2024-01-15T10:30:00Z"} + +# Создание таппла через API +curl -X POST http://localhost:9080/api/v1/tapple/university +# Response: {"success":true,"message":"Tapple 'university' created successfully","tapple":"university"} + +# Создание слайса +curl -X POST http://localhost:9080/api/v1/slice/university/students +# Response: {"success":true,"message":"Slice 'students' in tapple 'university' created successfully","slice":"students","tapple":"university"} + +# Получение списка тапплов +curl http://localhost:9080/api/v1/tapple/ +# Response: {"success":true,"tapples":" university\n"} + +# Получение информации о таппле +curl http://localhost:9080/api/v1/tapple/university +# Response: {"slices":" students\n","success":true,"tapple":"university"} +``` +(К началу)
+ +**Работа с кортежами** + +```bash +# Создание кортежа с данными студента +curl -X POST http://localhost:9080/api/v1/tuple/university/students/1001 \ + -H "Content-Type: application/json" \ + -d '{"name":"Alice Johnson","age":20,"major":"Computer Science","gpa":3.8}' +# Response: +# { +# "success": true, +# "message": "Tuple '1001' in slice 'students' created successfully", +# "tapple": "university", +# "slice": "students", +# "tuple": "1001", +# "fields": { +# "name": "Alice Johnson", +# "age": 20, +# "major": "Computer Science", +# "gpa": 3.8 +# } +# } + +# Создание второго студента +curl -X POST http://localhost:9080/api/v1/tuple/university/students/1002 \ + -H "Content-Type: application/json" \ + -d '{"name":"Bob Smith","age":22,"major":"Mathematics","gpa":3.5}' + +# Получение списка всех кортежей в слайсе +curl http://localhost:9080/api/v1/slice/university/students +# Response: +# { +# "success": true, +# "tapple": "university", +# "slice": "students", +# "tuples": "List of tuples in slice 'students':\n ID: 1001\n name: Alice Johnson\n age: 20\n major: Computer Science\n gpa: 3.8\n\n ID: 1002\n name: Bob Smith\n age: 22\n major: Mathematics\n gpa: 3.5\n" +# } + +# Получение конкретного кортежа +curl http://localhost:9080/api/v1/tuple/university/students/1001 +# Response: +# { +# "success": true, +# "tapple": "university", +# "slice": "students", +# "tuple": "1001", +# "data": "List of tuples in slice 'students':\n ID: 1001\n name: Alice Johnson\n age: 20\n major: Computer Science\n gpa: 3.8" +# } + +# Обновление кортежа +curl -X PUT http://localhost:9080/api/v1/tuple/university/students/1001 \ + -H "Content-Type: application/json" \ + -d '{"gpa":3.9,"graduation_year":2025}' +# Response: +# { +# "success": true, +# "message": "Tuple '1001' in slice 'students' updated successfully", +# "tapple": "university", +# "slice": "students", +# "tuple": "1001", +# "fields": { +# "gpa": 3.9, +# "graduation_year": 2025 +# } +# } + +# Удаление кортежа +curl -X DELETE http://localhost:9080/api/v1/tuple/university/students/1002 +# Response: {"success":true,"message":"Tuple '1002' in slice 'students' deleted successfully"} +``` + +**Быстрое создание через Quick API** + +```bash +# Quick API - самый простой способ создания данных +# Формат: /quick/create/{tapple}/{slice}/{tuple}/{JSON} + +# Создаём данные о продуктах +curl -X POST "http://localhost:9080/quick/create/shop/products/101/{\"name\":\"Laptop\",\"price\":999.99,\"in_stock\":true}" +# Response: +# { +# "success": true, +# "message": "Tuple '101' in slice 'products' created successfully", +# "tapple": "shop", +# "slice": "products", +# "tuple": "101", +# "fields": { +# "name": "Laptop", +# "price": 999.99, +# "in_stock": true +# } +# } + +# Создаём ещё один продукт (таппл и слайс создаются автоматически) +curl -X POST "http://localhost:9080/quick/create/shop/products/102/{\"name\":\"Mouse\",\"price\":29.99,\"in_stock\":true}" + +# Создаём пользователя +curl -X POST "http://localhost:9080/quick/create/shop/customers/201/{\"name\":\"John Doe\",\"email\":\"john@example.com\",\"loyalty_points\":150}" + +# Проверяем созданные данные +curl http://localhost:9080/api/v1/slice/shop/products +# Response показывает все продукты +``` +(К началу)
+ +## Комплексные примеры HTTP-API с различными типами данных + +```bash +# Создаём базу данных для библиотеки +curl -X POST http://localhost:9080/api/v1/tapple/library + +# Создаём слайс для книг +curl -X POST http://localhost:9080/api/v1/slice/library/books + +# Добавляем несколько книг +curl -X POST "http://localhost:9080/quick/create/library/books/978-1/{\"title\":\"1984\",\"author\":\"George Orwell\",\"year\":1949,\"available\":true}" +curl -X POST "http://localhost:9080/quick/create/library/books/978-2/{\"title\":\"Brave New World\",\"author\":\"Aldous Huxley\",\"year\":1932,\"available\":true}" +curl -X POST "http://localhost:9080/quick/create/library/books/978-3/{\"title\":\"Fahrenheit 451\",\"author\":\"Ray Bradbury\",\"year\":1953,\"available\":false}" + +# Поиск книг (через show tuples) +curl "http://localhost:9080/api/v1/slice/library/books" +# Response показывает все книги + +# Обновляем статус доступности +curl -X PUT "http://localhost:9080/api/v1/tuple/library/books/978-1" \ + -H "Content-Type: application/json" \ + -d '{"available":false,"borrowed_by":"user123"}' + +# Создаём слайс для читателей +curl -X POST http://localhost:9080/api/v1/slice/library/readers + +# Добавляем читателей +curl -X POST "http://localhost:9080/quick/create/library/readers/1001/{\"name\":\"Alice\",\"books_borrowed\":[\"978-1\"],\"membership\":\"premium\"}" +``` +**Обработка ошибок** + +```bash +# Попытка создать кортеж с невалидным JSON +curl -X POST "http://localhost:9080/quick/create/test/items/1/{invalid-json" +# Response: {"error":"Invalid JSON: invalid character 'i' looking for beginning of object key string","success":false} + +# Попытка получить несуществующий ресурс +curl http://localhost:9080/api/v1/tuple/nonexistent/table/id +# Response: {"error":"Tapple not found","success":false} + +# Неправильный метод HTTP +curl -X DELETE http://localhost:9080/api/v1/tapple/ +# Response: Method not allowed +``` +(К началу)
+ +## Пример рабочей сессии со всем реализованным функционалом + +```bash +# Создаём структуру данных +create tapple ecommerce +create slice ecommerce products +create slice ecommerce customers +create slice ecommerce orders + +# Создаём индексы +add.secondary.index ecommerce price +add.secondary.index ecommerce email + +# Добавляем данные (в транзакции) +begin +create tuple ecommerce products prod1 name=Laptop price=999.99 stock=10 +create tuple ecommerce products prod2 name=Mouse price=29.99 stock=50 +create tuple ecommerce customers cust1 name=Alice email=alice@mail.com +create tuple ecommerce orders order1 customer=cust1 product=prod1 quantity=1 +commit + +# Просматриваем данные +show tuples ecommerce products +show tuples ecommerce customers + +# Обновляем данные +update tuple ecommerce products prod1 stock=9 + +# Проверяем статус кластера +cluster.status + +# Смотрим статистику сжатия +compression.stats + +# Сценарий: Создание системы управления проектами + +# 1. Создаём структуру данных через HTTP API +curl -X POST http://localhost:9080/api/v1/tapple/project_management +curl -X POST http://localhost:9080/api/v1/slice/project_management/projects +curl -X POST http://localhost:9080/api/v1/slice/project_management/tasks +curl -X POST http://localhost:9080/api/v1/slice/project_management/users + +# 2. Добавляем проекты +curl -X POST "http://localhost:9080/quick/create/project_management/projects/proj1/{\"name\":\"Website Redesign\",\"status\":\"active\",\"budget\":50000}" +curl -X POST "http://localhost:9080/quick/create/project_management/projects/proj2/{\"name\":\"Mobile App\",\"status\":\"planning\",\"budget\":75000}" + +# 3. Добавляем пользователей +curl -X POST "http://localhost:9080/quick/create/project_management/users/user1/{\"name\":\"Alice\",\"role\":\"developer\"}" +curl -X POST "http://localhost:9080/quick/create/project_management/users/user2/{\"name\":\"Bob\",\"role\":\"manager\"}" + +# 4. Добавляем задачи +curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task1/{\"title\":\"Design mockups\",\"project\":\"proj1\",\"assigned_to\":\"user1\",\"status\":\"in_progress\"}" +curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task2/{\"title\":\"Setup repository\",\"project\":\"proj1\",\"assigned_to\":\"user1\",\"status\":\"done\"}" +curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task3/{\"title\":\"Create timeline\",\"project\":\"proj2\",\"assigned_to\":\"user2\",\"status\":\"pending\"}" + +# 5. Просмотр всех задач проекта +curl "http://localhost:9080/api/v1/slice/project_management/tasks" + +# 6. В клиенте СУБД проверяем ACL для разных пользователей +futriis:~> login admin admin +futriis:~> acl.createuser alice "Alice Developer" alicepass user +futriis:~> acl.grant alice read tapple project_management +futriis:~> acl.grant alice write slice project_management.tasks + +futriis:~> login alice alicepass +futriis:~> show tuples project_management tasks +# Видит все задачи +futriis:~> update tuple project_management tasks task1 status=completed +# Успешно обновляет + +# Выходим +exit +``` +(К началу)
+ +## Сферы применения + +Идеальными сферами применения проекта Futriix, являются следующие: + +1. **Микросервисы с потребностью в оперативной аналитике** +2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда** +3. **Приложения, тербующие среднего масштабирования со смешанными рабочими нагузками (англ. workload)** +4. **Прототипирование перед выбором специализированного решения** + +(К началу)
+ + +## Дорожная карта + +- [x] Реализовать +- [ ] Реализовать + +(К началу)
+ +## Контакты + +Григорий Сафронов - [E-mail](gvsafronov@yandex.ru) + +(К началу)