Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Использование репозиториев #20

Merged
merged 25 commits into from
Dec 5, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
332cb01
Начало работ по репозиторию и хранению пула сущностей
nixel2007 Oct 25, 2018
e830679
Fix QF
nixel2007 Oct 25, 2018
35e8423
#1. Перенос логики работы библиотеки в объект ХранилищеСущностей
nixel2007 Oct 29, 2018
bc30515
#1 Исправлено получение ссылочного хранилища
nixel2007 Nov 9, 2018
80c09e8
#1 Закрытие всех хранилищ при закрытии менеджера
nixel2007 Nov 9, 2018
e78dfd1
#1 Shared in-memory database для тестов
nixel2007 Nov 9, 2018
848c699
Добавлен вызов GC для очистки ссылок на соединения с СУБД
nixel2007 Nov 9, 2018
19bf6e2
#1 Общий код для создания коннекторов. Хранилища переведены на работу…
nixel2007 Nov 9, 2018
107bdc8
Fix #19. Исправлено зацикливание при ссылке сущности самой на себя
nixel2007 Nov 10, 2018
0f9c11f
Fix #18. Использование пула сущностей для работы с одинаковыми ссылка…
nixel2007 Nov 10, 2018
731f509
Fix QF
nixel2007 Nov 10, 2018
70fa41b
Таски для тестирования и код-кавереджа
nixel2007 Nov 22, 2018
d58cba6
Требование возврата строки соединения и параметров в коннекторе
nixel2007 Nov 22, 2018
a8ac3cc
#18 #1 Вынос логики работы с коннекторами в отдельный модуль. Решение…
nixel2007 Nov 22, 2018
21550aa
Использование библиотеки semaphore для синхронизации получения хранилищ
nixel2007 Nov 22, 2018
be4bd10
Переезд на semaphore 1.0.1
nixel2007 Nov 22, 2018
c1f5ca8
Перенос internal классов
nixel2007 Dec 4, 2018
1096293
Ссылки на классы в README и добавление ХранилищеСущностей под версион…
nixel2007 Dec 4, 2018
6a1e72c
Описание API для публичных методов
nixel2007 Dec 4, 2018
0335fd6
Документация по хранилищам сущностей
nixel2007 Dec 4, 2018
73640f2
Хранение хранилищ сущностей в разрезе типов сущностей, типов коннекто…
nixel2007 Dec 4, 2018
44c2a4e
Уточнение по получению хранилищ сущностей
nixel2007 Dec 4, 2018
c4315cf
Описание коннектора к sqlite и сноска про работу in-memory баз в ново…
nixel2007 Dec 4, 2018
ebcd14c
Небольшое описание работы с транзакциями
nixel2007 Dec 5, 2018
bedfd7e
Убран breaking change на API коннекторов. Доп свойства коннекторов пе…
nixel2007 Dec 5, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
*.db
*.ospx

coverage/
tests.xml
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"language-1c-bsl.linterEntryPoint": "./src/fake-entrypoint.os"
}
84 changes: 74 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# entity - OneScript Persistence API


[![GitHub release](https://img.shields.io/github/release/nixel2007/entity.svg?style=flat-square)](https://github.com/nixel2007/entity/releases)
[![GitHub license](https://img.shields.io/github/license/nixel2007/entity.svg?style=flat-square)](https://github.com/nixel2007/entity/blob/develop/LICENSE.md)

Expand Down Expand Up @@ -139,7 +138,7 @@
// В метод можно передать отбор в виде соответствия, аналогично методу Получить()
СохраненноеФизЛицо = МенеджерСущностей.ПолучитьОдно(Тип("ФизическоеЛицо"), Отбор);

// Если вызвать метод с параметром не-соответствием, то будет осуществлен поиск по идентификатору сущности.
// Если вызвать метод "ПолучитьОдно" с параметром не-соответствием, то будет осуществлен поиск по идентификатору сущности.
Идентификатор = 123;
СохраненноеФизЛицо = МенеджерСущностей.ПолучитьОдно(Тип("ФизическоеЛицо"), Идентификатор);
```
Expand All @@ -162,13 +161,45 @@
## Удаление сущностей

```bsl

// Допустим имеется сущность, которую надо удалить.

МенеджерСущностей.Удалить(СущностьФизическоеЛицо);

// После выполнения метода в БД не останется строки с идентификатором, равным идентификатору сущности
```

## Работа через ХранилищеСущностей

Для упрощения взаимодействия с библиотекой помимо МенеджераСущностей, подразумевающего постоянную передачу *типа сущности*, осуществлять операции над сущностями можно через ХранилищеСущностей.
Хранилище сущностей предоставляет тот же базовый интерфейс, что и МенеджерСущности, но не требует передачи типа сущности как параметра.

```bsl
// Получение хранилища сущностей
ХранилищеФизЛиц = МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ФизическоеЛицо"));

// Поиск сущностей
Идентификатор = 1;
ФизЛицо = ХранилищеФизЛиц.ПолучитьОдно(Идентификатор);

ФизЛицо.Имя = "Петр";

ХранилищеФизЛиц.Сохранить(ФизЛицо);
```

### Работа с транзакциями

Методы по работе с транзакциями есть как в Менеджере сущностей, так и в Хранилище сущностей.

Транзакционность поддерживается в рамках экземпляра менеджера сущностей или хранилища сущностей. При необходимости работы с транзакциями с несколькими типами сущностей следует использовать методы работы с транзакциями в Менеджере сущностей и модифицировать сущности через него же.

```bsl
МенеджерСущностей.НачатьТранзацию();

// Объекты ФизическоеЛицо и СтранаМира из примеров выше:
МенеджерСущностей.Сохранить(СтранаМира);
МенеджерСущностей.Сохранить(СохраняемоеФизЛицо);

МенеджерСущностей.ЗафиксироватьТранзакцию();
```

## Система аннотаций для сущностей
Expand Down Expand Up @@ -239,7 +270,15 @@
* Трансляция запросов от прикладной логики к коннекторам
* Конструирование найденных сущностей по данным, возвращаемым коннекторами

### Коннекторы
### ХранилищеСущностей

ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с глобальной привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`.

В отличие от МенеджераСущностей, ХранилищеСущностей не требует передачи в методы параметра "ТипСущности".

Хранилища сущностей и пулы сущностей совпадают в рамках одного типа сущности, типа коннектора и строки соединения. Другими словами, два менеджера сущности, проинициализированные одним и тем же коннектором и строкой соединения, вернут одинаковые хранилища сущностей одного типа.

### Коннекторы (АбстрактныйКоннектор)

Коннектор содержит в себе логику по работе с конкретной СУБД. Например, `КоннекторSQLite` служит для оперирования СУБД SQLite. В зоне ответственности коннектора находятся:

Expand All @@ -256,6 +295,10 @@

Например, `КоннекторJSON` не умеет работать с транзакциями, однако, он имеет соответствующие методы, выводящие диагностические сообщения при их вызове.

> Важно!

Каждое ХранилищеСущностей и МенеджерСущностей хранят в себе отдельные экземпляры Коннекторов. Тип, строка соединения и параметры коннектора определяются при создании МенеджераСущностей.

### МодельДанных

Модель данных хранит в себе список всех зарегистрированных классов-сущности в виде ОбъектовМодели
Expand All @@ -277,6 +320,16 @@

Помимо мета-информации ОбъектМодели позволяет получать значения колонок таблицы на основании имен полей сущности (и наоборот), вычислять значение идентификатора сущности, выполнять приведение типов и установку значений полей сущности.

### КоннекторSQLite

В состав библиотеки входит референсная реализация интерфейса коннектора в виде коннектора к СУБД SQLite. Реализация базируется на библиотеке [sql](https://github.com/oscript-library/sql).

Коннектор поддерживает все CRUD-операции над сущностями, простой и сложный поиск, работу с транзакциями.

> Внимание!

При использовании in-memory базы данных в моделях больше, чем с одним типом сущности, строка соединения должна выглядеть так: `"FullUri=file::memory:?cache=shared"`

## Версионирование и обратная совместимость

Библиотека `entity` в целом следует концепции [семантического версионирования](https://semver.org/) со следующими изменениями в правилах нумерации версий:
Expand All @@ -294,13 +347,24 @@
Под контроль и обязательство соблюдения обратной совместимости попадают:

* для Major.Entity:
* все публичные методы классов "МенеджерСущности", "МодельДанных", "ОбъектМодели", "ЭлементОтбора", непомеченные как нестабильные (`@unstable`) в описании метода;
* значения модулей-перечислений "ТипыКолонок" и "ВидСравнения";
* все публичные непомеченные как "нестабильные" (`@unstable`) или "для служебного использования" (`@internal`) методы классов:
* [`МенеджерСущности`](src/Классы/МенеджерСущностей.os),
* [`ХранилищеСущностей`](src/Классы/ХранилищеСущностей.os),
* [`МодельДанных`](src/Классы/МодельДанных.os),
* [`ОбъектМодели`](src/Классы/ОбъектМодели.os),
* [`ЭлементОтбора`](src/Классы/ЭлементОтбора.os);
* значения модулей-перечислений:
* [`ТипыКолонок`](src/Модули/ТипыКолонок.os),
* [`ВидСравнения`](src/Модули/ВидСравнения.os);
* состав и параметры аннотаций сущностей;
* для Major.Connector:
* все публичные методы класса "АбстрактныйКоннектор" и их сигнатуры;
* все публичные методы классов "МодельДанных", "ОбъектМодели", "ЭлементОтбора", непомеченные как нестабильные
(`@unstable`) в описании метода.
* значения модулей-перечислений "ТипыКолонок" и "ВидСравнения";
* все публичные методы класса [`АбстрактныйКоннектор`](src/Классы/АбстрактныйКоннектор.os) и их сигнатуры;
* все публичные непомеченные как "нестабильные" (`@unstable`) методы классов:
* [`МодельДанных`](src/Классы/МодельДанных.os),
* [`ОбъектМодели`](src/Классы/ОбъектМодели.os),
* [`ЭлементОтбора`](src/Классы/ЭлементОтбора.os);
* значения модулей-перечислений:
* [`ТипыКолонок`](src/Модули/ТипыКолонок.os),
* [`ВидСравнения`](src/Модули/ВидСравнения.os).

> To be continued...
1 change: 1 addition & 0 deletions lib.config
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<class name="МодельДанных" file="src/Классы/МодельДанных.os"/>
<class name="ОбъектМодели" file="src/Классы/ОбъектМодели.os"/>
<class name="ЭлементОтбора" file="src/Классы/ЭлементОтбора.os"/>
<class name="ХранилищеСущностей" file="src/Классы/ХранилищеСущностей.os"/>
<module name="ТипыКолонок" file="src/Модули/ТипыКолонок.os"/>
<module name="ВидСравнения" file="src/Модули/ВидСравнения.os"/>
</package-def>
5 changes: 1 addition & 4 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// Полную документацию см. на hub.oscript.io/packaging
//


Описание.Имя("entity")
.Версия("2.2.0.0")
.Автор("Nikita Gryzlov")
Expand All @@ -18,9 +17,7 @@
.ЗависитОт("asserts", "1.1.1")
.ЗависитОт("logos", "1.2.0")
.ЗависитОт("reflector", "0.6.0")
.ЗависитОт("semaphore", "1.0.1")
.ЗависитОт("sql", "1.1.0.0")
.ЗависитОт("strings", "0.4.1")
//.ЗависитОт("package2", ">=1.1", "<2.0")
//.ОпределяетКласс("УправлениеВселенной", "src/universe-mngr.os")
//.ОпределяетМодуль("ПолезныеФункции", "src/tools.os")
;
1 change: 1 addition & 0 deletions src/fake-entrypoint.os
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#Использовать ".."
Loading