Upload files to "/"
This commit is contained in:
parent
bcb457be43
commit
4053cda386
699
README.md
Normal file
699
README.md
Normal file
@ -0,0 +1,699 @@
|
|||||||
|
<!-- Improved compatibility of К началу link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->
|
||||||
|
<a id="readme-top"></a>
|
||||||
|
<!--
|
||||||
|
*** Thanks for checking out the Best-README-Template. If you have a suggestion
|
||||||
|
*** that would make this better, please fork the repo and create a pull request
|
||||||
|
*** or simply open an issue with the tag "enhancement".
|
||||||
|
*** Don't forget to give the project a star!
|
||||||
|
*** Thanks again! Now go create something AMAZING! :D
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- PROJECT LOGO -->
|
||||||
|
<br />
|
||||||
|
<div align="center">
|
||||||
|
<!-- <a href="https://github.com/othneildrew/Best-README-Template"> -->
|
||||||
|
<img src="Logo.png" height=100 alt="Logo.png"></img>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<h3> <b>Futriis-это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД,
|
||||||
|
реализованная на Go с поддержкой плагинов на языке lua для операционных систем на базе Solaris (ядра Illumos)</b> <br></h3>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<!-- <a href="">Сообщить об ошибке</a>
|
||||||
|
·
|
||||||
|
<!-- <a href="">Предложение новой функциональности</a> -->
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Краткая документация проекта FutriiS
|
||||||
|
|
||||||
|
<!-- TABLE OF CONTENTS -->
|
||||||
|
<br>
|
||||||
|
<!-- <details> -->
|
||||||
|
<summary><b>Содержание</b></summary></br>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<a href="#о-проекте">О проекте</a>
|
||||||
|
<li><a href="#лицензия">Лицензия</a></li>
|
||||||
|
<li><a href="#глоссарий">Глоссарий</a></li>
|
||||||
|
<li><a href="#типы-данных-субд">Типы данных субд</a></li>
|
||||||
|
<li><a href="#системные-требования">Системные требования</a></li>
|
||||||
|
<li><a href="#подготовка-и-компиляция">Подготовка и компиляция</a></li>
|
||||||
|
<li><a href="#тестирование">Тестирование</a></li>
|
||||||
|
<li><a href="#примеры-команд-субд">Примеры команд субд</a></li>
|
||||||
|
<li><a href="#индексы">Индексы</a></li>
|
||||||
|
<li><a href="#транзакции">Транзакции</a></li>
|
||||||
|
<li><a href="#кластеризация-и-шардинг">Кластеризация и шардинг</a></li>
|
||||||
|
<li><a href="#сжатие-данных">Сжатие данных</a></li>
|
||||||
|
<li><a href="#aof-(Append-Only File)">AOF (Append-Only File)</a></li>
|
||||||
|
<li><a href="#lua-плагины">Lua-плагины</a></li>
|
||||||
|
<li><a href="acl-списки-доступа"></a>ACL списки доступа</li>
|
||||||
|
<li><a href="#http-api">HTTP API</a></li>
|
||||||
|
<li><a href="#сферы-применения">Сферы применения</a></li>
|
||||||
|
<li><a href="#дорожная-карта">Дорожная карта</a></li>
|
||||||
|
<li><a href="#контакты">Контакты</a></li>
|
||||||
|
</ol>
|
||||||
|
<!-- </details> -->
|
||||||
|
|
||||||
|
|
||||||
|
## О проекте
|
||||||
|
|
||||||
|
futriis - это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД, реализованная на Go с поддержкой плагинов на языке lua и особенным демоном кластеризации, реализующий паттерн "центральный диспетчер"-futriisd.
|
||||||
|
|
||||||
|
**Демон futriisd**
|
||||||
|
|
||||||
|
futriisd - это демон (сервис) представляющий из себя бинарный файл "futriisd" СУБД Futriis, расположенный в /futriis/build/futriisd, Этот файл является:
|
||||||
|
|
||||||
|
- Основным исполняемым файлом сервера - запускает ядро СУБД в фоновом режиме как демон (daemon)
|
||||||
|
- Точкой входа для кластерного узла - каждый узел кластера запускается через этот бинарный файл
|
||||||
|
- Фоновым процессом - работает независимо от терминала, обрабатывая сетевые запросы
|
||||||
|
- Управляющим процессом - отвечает за инициализацию всех компонентов: хранилища, кластера, репликации, AOF
|
||||||
|
- Сетевым сервером - слушает порты для координации кластера и обработки клиентских подключений
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Глоссарий
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Типы данных субд
|
||||||
|
|
||||||
|
СУБД реализует три основных типа данных:
|
||||||
|
- **Таппл (Tapple)** - аналог базы данных в РСУБД
|
||||||
|
- **Слайс (Slice)** - аналог таблицы
|
||||||
|
- **Кортеж (Tuple)** - аналог записи в таблице
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Системные требования
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> - Процессор: Intel или AMD
|
||||||
|
> - Оперативная память: 4ГБ (Для Linux) 8ГБ (Для Illumos sytems)
|
||||||
|
> - Только Unix-подобная ОС (Solaris, OpenIndiana, Linux)
|
||||||
|
> - Go 1.25.6 или выше
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> **Важно: Windows и MacOS X не поддерживаются!**
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
## Подготовка и компиляция
|
||||||
|
|
||||||
|
1. Клонируйте репозиторий:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/futriis/db.git
|
||||||
|
cd futriis
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Скомпилируйте и запустите:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build.sh
|
||||||
|
./futriis
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
**Пример использования демона "futriisd"**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Запуск узла кластера
|
||||||
|
./futriisd --config /path/to/config.toml --node-id node-1
|
||||||
|
|
||||||
|
# Запуск координатора
|
||||||
|
./futriisd --config /path/to/config.toml --coordinator
|
||||||
|
|
||||||
|
# Запуск в фоновом режиме
|
||||||
|
./futriisd --daemon
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
### Примеры команд субд
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
#### Просмотр списков
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Индексы
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать первичный индекс для таппла
|
||||||
|
add.prime.index users
|
||||||
|
|
||||||
|
# Удалить первичный индекс
|
||||||
|
delete.prime.index users
|
||||||
|
|
||||||
|
# Создать вторичный индекс по полю
|
||||||
|
add.secondary.index users email
|
||||||
|
add.secondary.index users age
|
||||||
|
|
||||||
|
# Удалить вторичный индекс
|
||||||
|
delete.secondary.index users email
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Транзакции
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Начать транзакцию
|
||||||
|
begin
|
||||||
|
|
||||||
|
# Выполнить операции внутри транзакции
|
||||||
|
create tuple users user_profiles user3 name=Bob age=28
|
||||||
|
update tuple users user_profiles user1 city=Chicago
|
||||||
|
|
||||||
|
# Зафиксировать транзакцию
|
||||||
|
commit
|
||||||
|
|
||||||
|
# Или откатить транзакцию
|
||||||
|
rollback
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
## Кластеризация и шардинг
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Сжатие данных
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать статистику сжатия по колонкам
|
||||||
|
compression.stats
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## AOF (Append-Only File)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать информацию о AOF файле
|
||||||
|
aof.info
|
||||||
|
|
||||||
|
# Восстановить данные из AOF файла
|
||||||
|
aof.recover
|
||||||
|
aof.recover /path/to/custom/file.aof
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Lua-плагины
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Выполнить Lua плагин
|
||||||
|
lua my_plugin
|
||||||
|
lua analytics_script
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## 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'
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## 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"}
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
**Работа с кортежами**
|
||||||
|
|
||||||
|
```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 показывает все продукты
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Комплексные примеры 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
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Пример рабочей сессии со всем реализованным функционалом
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Сферы применения
|
||||||
|
|
||||||
|
Идеальными сферами применения проекта Futriix, являются следующие:
|
||||||
|
|
||||||
|
1. **Микросервисы с потребностью в оперативной аналитике**
|
||||||
|
2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда**
|
||||||
|
3. **Приложения, тербующие среднего масштабирования со смешанными рабочими нагузками (англ. workload)**
|
||||||
|
4. **Прототипирование перед выбором специализированного решения**
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
## Дорожная карта
|
||||||
|
|
||||||
|
- [x] Реализовать
|
||||||
|
- [ ] Реализовать
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
## Контакты
|
||||||
|
|
||||||
|
Григорий Сафронов - [E-mail](gvsafronov@yandex.ru)
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
Loading…
x
Reference in New Issue
Block a user