From 332cb0145e7e59aae853c3356d67036c583fa58a Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 25 Oct 2018 19:58:13 +0300 Subject: [PATCH 01/25] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=20=D0=BF=D0=BE=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8E=20=D0=B8?= =?UTF-8?q?=20=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8E=20=D0=BF?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.config | 2 ++ ...20\276\321\201\321\202\320\265\320\271.os" | 17 ++++++++++++++++ ...20\276\321\201\321\202\320\265\320\271.os" | 17 ++++++++++++++++ ...20\276\321\201\321\202\320\265\320\271.os" | 20 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" create mode 100644 "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" diff --git a/lib.config b/lib.config index 42355aa..a7a9d27 100644 --- a/lib.config +++ b/lib.config @@ -5,6 +5,8 @@ + + \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" new file mode 100644 index 0000000..26bdcd2 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -0,0 +1,17 @@ +Перем ОбъектМодели; +Перем ПулСущностей; + +Процедура ПриСозданииОбъекта(ПОбъектМодели) + ОбъектМодели = ПОбъектМодели; + + ПулСущностей = Новый Соответствие(); +КонецПроцедуры + +Функция Получить(ЗначениеИдентификатора) Экспорт + Сущность = ПулСущностей.Получить(ЗначениеИдентификатора); + Возврат Сущность; +КонецФункции + +Функция Сохранить(Сущность) Экспорт + ПулСущностей.Вставить(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность), Сущность); +КонецФункции diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" new file mode 100644 index 0000000..4f9d8e2 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -0,0 +1,17 @@ +Перем Хранилища; + +Функция Получить(ТипСущности, ТипКоннектора, СтрокаСоединения) Экспорт + + // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения + // TODO: synchronized/mutex: + ХранилищеСущностей = Хранилища.Получить(ТипСущности); + Если ХранилищеСущностей = Неопределено Тогда + ХранилищеСущностей = Новый ХранилищеСущностей(ТипСущности); + Хранилища.Вставить(ТипСущности, ХранилищеСущностей); + КонецЕсли; + + Возврат ХранилищеСущностей; + +КонецФункции + +Хранилища = Новый Соответствие(); diff --git "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index a4ec40d..afc6007 100644 --- "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -263,4 +263,24 @@ КонецПроцедуры +&Тест +Процедура СинхронизацияЭкземпляровСущностей() Экспорт + + Сущность = Новый СущностьСоВсемиТипамиКолонок; + Сущность.Целое = 1; + //Сущность.Ссылка = Сущность; + МенеджерСущностей.Сохранить(Сущность); + + Сущность1 = МенеджерСущностей.ПолучитьОдно(Тип("СущностьСоВсемиТипамиКолонок"), 1); + Сущность2 = МенеджерСущностей.ПолучитьОдно(Тип("СущностьСоВсемиТипамиКолонок"), 1); + + Ожидаем.Что(Сущность1, "Ссылки на сущности совпадают").Равно(Сущность2); + + Сущность1.Целое = 2; + Ожидаем.Что(Сущность2.Целое, "Поля сущностей синхронизированы").Равно(Сущность1.Целое); + + Ожидаем.Что(Сущность1.Ссылка, "Сущность ссылается сама на себя").Равно(Сущность1); + +КонецПроцедуры + // TODO: Переписать тесты с проверки на записи в таблице БД на вызов методов поиска, когда они будут реализованы From e8306791e5214f0783ab9b9e0d54199fa9a29947 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 25 Oct 2018 19:58:23 +0300 Subject: [PATCH 02/25] Fix QF --- ...275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" | 1 - 1 file changed, 1 deletion(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" index edcf1b0..ef608c0 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" @@ -166,7 +166,6 @@ ИменаКолонок = ИменаКолонок + Символы.Таб + ДанныеОКолонке.ИмяКолонки + "," + Символы.ПС; ЗначенияКолонок = ЗначенияКолонок + Символы.Таб + "@" + ДанныеОКолонке.ИмяКолонки + "," + Символы.ПС; - ЗначениеПараметра = ОбъектМодели.ПолучитьПриведенноеЗначениеПоля(Сущность, ДанныеОКолонке.ИмяПоля); Запрос.УстановитьПараметр(ДанныеОКолонке.ИмяКолонки, ЗначениеПараметра); КонецЦикла; From 35e84232420a93713fc81eea387d9caefed31638 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 29 Oct 2018 23:21:22 +0300 Subject: [PATCH 03/25] =?UTF-8?q?#1.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20=D0=B2=20=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=20=D0=A5=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=89=D0=B5=D0=A1=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 + src/fake-entrypoint.os | 1 + ...20\276\321\201\321\202\320\265\320\271.os" | 134 ++----------- ...20\276\321\201\321\202\320\265\320\271.os" | 181 +++++++++++++++++- ...20\276\321\201\321\202\320\265\320\271.os" | 8 +- 5 files changed, 202 insertions(+), 125 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 src/fake-entrypoint.os diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..469f0d1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "language-1c-bsl.linterEntryPoint": "./src/fake-entrypoint.os" +} \ No newline at end of file diff --git a/src/fake-entrypoint.os b/src/fake-entrypoint.os new file mode 100644 index 0000000..614c512 --- /dev/null +++ b/src/fake-entrypoint.os @@ -0,0 +1 @@ +#Использовать ".." diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 0864480..d59af12 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -65,13 +65,8 @@ Процедура Сохранить(Сущность) Экспорт ТипСущности = ТипЗнч(Сущность); - ПроверитьЧтоКлассЯвляетсяСущностью(ТипСущности); - ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности); - ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность); - - ОбъектМодели = МодельДанных.Получить(ТипСущности); - - Коннектор.Сохранить(ОбъектМодели, Сущность); + ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); + ХранилищеСущностей.Сохранить(Сущность); КонецПроцедуры // Осуществляет поиск сущностей переданного типа по идентификатору. @@ -93,70 +88,9 @@ // Функция Получить(ТипСущности, Отбор = Неопределено) Экспорт - ОбъектМодели = МодельДанных.Получить(ТипСущности); - Колонки = ОбъектМодели.Колонки(); - - ПередаваемыйОтбор = Новый Массив; - - Если ТипЗнч(Отбор) = Тип("Соответствие") Тогда - // Переформируем ключи отбора из имен полей в имена колонок - Для Каждого КлючИЗначение Из Отбор Цикл - Колонка = Колонки.Найти(КлючИЗначение.Ключ, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", КлючИЗначение.Ключ) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ВидСравнения.Равно, КлючИЗначение.Значение)); - КонецЦикла; - ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда - Для Каждого ЭлементОтбора Из Отбор Цикл - Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); - КонецЦикла; - ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда - ЭлементОтбора = Отбор; - Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); - ИначеЕсли Отбор = Неопределено Тогда - // no-op - Иначе - ВызватьИсключение "В метод получения данных передан неожиданный тип отбора: " + ТипЗнч(Отбор); - КонецЕсли; - - НайденныеСущности = Новый Массив; - - НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор); - Если НайденныеСтроки.Количество() = 0 Тогда - Возврат НайденныеСущности; - КонецЕсли; - - Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл - Сущность = Новый(ТипСущности); - - Для Каждого Колонка Из Колонки Цикл - ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); - Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда - ЗначениеКолонки = ПолучитьОдно(Колонка.ТипСсылки, ЗначениеКолонки); - КонецЕсли; - ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); - КонецЦикла; + ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); + Возврат ХранилищеСущностей.Получить(Отбор); - НайденныеСущности.Добавить(Сущность); - КонецЦикла; - - Возврат НайденныеСущности; - КонецФункции // Осуществляет поиск сущности переданного типа по идентификатору. @@ -178,28 +112,8 @@ // "ТипуСущности", с заполненными значениями полей. Иначе возвращается "Неопределено". // Функция ПолучитьОдно(ТипСущности, Знач Отбор = Неопределено) Экспорт - ОбъектМодели = МодельДанных.Получить(ТипСущности); - - Если Отбор = Неопределено Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("Соответствие") Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда - ПередаваемыйОтбор = Отбор; - Иначе - ПередаваемыйОтбор = Новый Соответствие(); - ПередаваемыйОтбор.Вставить(ОбъектМодели.Идентификатор().ИмяПоля, Отбор); - КонецЕсли; - - НайденныеСущности = Получить(ТипСущности, ПередаваемыйОтбор); - - Если НайденныеСущности.Количество() = 0 Тогда - Возврат Неопределено; - Иначе - Возврат НайденныеСущности[0]; - КонецЕсли; + ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); + Возврат ХранилищеСущностей.ПолучитьОдно(Отбор); КонецФункции // Удаляет удаление сущности из базы данных. @@ -208,10 +122,11 @@ // Параметры: // Сущность - Произвольный - Удаляемая сущность // -Функция Удалить(Сущность) Экспорт - ОбъектМодели = МодельДанных.Получить(ТипЗнч(Сущность)); - Коннектор.Удалить(ОбъектМодели, Сущность); -КонецФункции +Процедура Удалить(Сущность) Экспорт + ТипСущности = ТипЗнч(Сущность); + ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); + ХранилищеСущностей.Удалить(Сущность); +КонецПроцедуры // Посылает коннектору запрос на закрытие соединения. // @@ -220,6 +135,7 @@ Коннектор.Закрыть(); КонецЕсли; МодельДанных.Очистить(); + // TODO: Закрыть все хранилища? КонецПроцедуры // Посылает коннектору запрос на начало транзакции. @@ -250,6 +166,12 @@ Возврат Коннектор; КонецФункции +Функция ПолучитьХранилищеСущностей(ТипСущности) Экспорт + ОбъектМодели = МодельДанных.Получить(ТипСущности); + ХранилищеСущностей = ХранилищаСущностей.Получить(ОбъектМодели, Коннектор, СтрокаСоединенияКоннектора); + Возврат ХранилищеСущностей; +КонецФункции + // <Описание процедуры> // // Параметры: @@ -283,23 +205,5 @@ ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств("Идентификатор"); Ожидаем.Что(ТаблицаСвойств, СтрШаблон("Класс %1 не имеет поля с аннотацией &Идентификатор", ТипКласса)).ИмеетДлину(1); - -КонецПроцедуры - -Процедура ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности) - ОбъектМодели = МодельДанных.Получить(ТипСущности); - Ожидаем.Что(ОбъектМодели, "Тип сущности не зарегистрирован в модели данных").Не_().Равно(Неопределено); -КонецПроцедуры - -Процедура ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность) - ОбъектМодели = МодельДанных.Получить(Тип(Сущность)); - Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда - Возврат; - КонецЕсли; - ЗначениеИдентификатора = ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность); - Ожидаем.Что( - ЗначениеИдентификатора, СтрШаблон("Сущность с типом %1 должна иметь заполненный идентификатор", Тип(Сущность)) - ).Заполнено(); - -КонецПроцедуры +КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 26bdcd2..4304649 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,17 +1,186 @@ Перем ОбъектМодели; +Перем Коннектор; +Перем СтрокаСоединения; Перем ПулСущностей; -Процедура ПриСозданииОбъекта(ПОбъектМодели) +Процедура ПриСозданииОбъекта(Знач ПОбъектМодели, Знач ПКоннектор, Знач ПСтрокаСоединения) ОбъектМодели = ПОбъектМодели; + Коннектор = ПКоннектор; + СтрокаСоединения = ПСтрокаСоединения; ПулСущностей = Новый Соответствие(); КонецПроцедуры -Функция Получить(ЗначениеИдентификатора) Экспорт - Сущность = ПулСущностей.Получить(ЗначениеИдентификатора); - Возврат Сущность; -КонецФункции - Функция Сохранить(Сущность) Экспорт + ТипСущности = ТипЗнч(Сущность); + + ПроверитьЧтоКлассЯвляетсяСущностью(ТипСущности); + ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности); + ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность); + + Коннектор.Сохранить(ОбъектМодели, Сущность); + ПулСущностей.Вставить(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность), Сущность); КонецФункции + +Функция Получить(Отбор = Неопределено) Экспорт + Колонки = ОбъектМодели.Колонки(); + + ПередаваемыйОтбор = Новый Массив; + + Если ТипЗнч(Отбор) = Тип("Соответствие") Тогда + // Переформируем ключи отбора из имен полей в имена колонок + Для Каждого КлючИЗначение Из Отбор Цикл + Колонка = Колонки.Найти(КлючИЗначение.Ключ, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", КлючИЗначение.Ключ) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ВидСравнения.Равно, КлючИЗначение.Значение)); + КонецЦикла; + ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда + Для Каждого ЭлементОтбора Из Отбор Цикл + Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); + КонецЦикла; + ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда + ЭлементОтбора = Отбор; + Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); + ИначеЕсли Отбор = Неопределено Тогда + // no-op + Иначе + ВызватьИсключение "В метод получения данных передан неожиданный тип отбора: " + ТипЗнч(Отбор); + КонецЕсли; + + НайденныеСущности = Новый Массив; + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат НайденныеСущности; + КонецЕсли; + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Сущность = Новый(ОбъектМодели.ТипСущности()); + + Для Каждого Колонка Из Колонки Цикл + ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); + Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда + ХранилищеСущностейСсылки = ХранилищаСущностей.Получить(Колонка.ТипСсылки, Коннектор, СтрокаСоединения); + ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); + КонецЕсли; + ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); + КонецЦикла; + + НайденныеСущности.Добавить(Сущность); + КонецЦикла; + + Возврат НайденныеСущности; +КонецФункции + +Функция ПолучитьОдно(Знач Отбор = Неопределено) Экспорт + + Если Отбор = Неопределено Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("Соответствие") Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда + ПередаваемыйОтбор = Отбор; + Иначе + ПередаваемыйОтбор = Новый Соответствие(); + ПередаваемыйОтбор.Вставить(ОбъектМодели.Идентификатор().ИмяПоля, Отбор); + КонецЕсли; + + НайденныеСущности = Получить(ПередаваемыйОтбор); + + Если НайденныеСущности.Количество() = 0 Тогда + Возврат Неопределено; + Иначе + Возврат НайденныеСущности[0]; + КонецЕсли; + +КонецФункции + +// Удаляет удаление сущности из базы данных. +// Сущность должна иметь заполненный идентификатор. +// +// Параметры: +// Сущность - Произвольный - Удаляемая сущность +// +Процедура Удалить(Сущность) Экспорт + Коннектор.Удалить(ОбъектМодели, Сущность); +КонецПроцедуры + +// Посылает коннектору запрос на начало транзакции. +// +Процедура НачатьТранзакцию() Экспорт + Коннектор.НачатьТранзакцию(); +КонецПроцедуры + +// Посылает коннектору запрос на фиксацию транзакции. +// +Процедура ЗафиксироватьТранзакцию() Экспорт + Коннектор.ЗафиксироватьТранзакцию(); +КонецПроцедуры + +// Посылает коннектору запрос на отмену транзакции. +// +Процедура ОтменитьТранзакцию() Экспорт + Коннектор.ОтменитьТранзакцию(); +КонецПроцедуры + +// Возвращает текущий активный коннектор. +// +// Возвращаемое значение: +// АбстрактныйКоннектор - Возвращает экземпляр коннектора. Конкретная реализация определяется параметром +// ТипКоннектора при вызове конструктора МенеджерСущностей. +// +Функция ПолучитьКоннектор() Экспорт + Возврат Коннектор; +КонецФункции + +// <Описание процедуры> +// +// Параметры: +// ТипКласса - Тип - Тип, в котором проверяется наличие необходимых аннотаций. +// +Процедура ПроверитьЧтоКлассЯвляетсяСущностью(ТипКласса) + + РефлекторОбъекта = Новый РефлекторОбъекта(ТипКласса); + ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов("Сущность", Ложь); + Ожидаем.Что(ТаблицаМетодов, СтрШаблон("Класс %1 не имеет аннотации &Сущность", ТипКласса)).ИмеетДлину(1); + + ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств("Идентификатор"); + Ожидаем.Что(ТаблицаСвойств, СтрШаблон("Класс %1 не имеет поля с аннотацией &Идентификатор", ТипКласса)).ИмеетДлину(1); + +КонецПроцедуры + +Процедура ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности) + // TODO: проверка должна быть в момент получения репозитория + Ожидаем.Что(ОбъектМодели, "Тип сущности не зарегистрирован в модели данных").Не_().Равно(Неопределено); +КонецПроцедуры + +Процедура ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность) + Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда + Возврат; + КонецЕсли; + + ЗначениеИдентификатора = ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность); + Ожидаем.Что( + ЗначениеИдентификатора, СтрШаблон("Сущность с типом %1 должна иметь заполненный идентификатор", Тип(Сущность)) + ).Заполнено(); + +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 4f9d8e2..bc92bcf 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,13 +1,13 @@ Перем Хранилища; -Функция Получить(ТипСущности, ТипКоннектора, СтрокаСоединения) Экспорт +Функция Получить(ОбъектМодели, Коннектор, СтрокаСоединения) Экспорт // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения // TODO: synchronized/mutex: - ХранилищеСущностей = Хранилища.Получить(ТипСущности); + ХранилищеСущностей = Хранилища.Получить(ОбъектМодели.ТипСущности()); Если ХранилищеСущностей = Неопределено Тогда - ХранилищеСущностей = Новый ХранилищеСущностей(ТипСущности); - Хранилища.Вставить(ТипСущности, ХранилищеСущностей); + ХранилищеСущностей = Новый ХранилищеСущностей(ОбъектМодели, Коннектор, СтрокаСоединения); + Хранилища.Вставить(ОбъектМодели.ТипСущности(), ХранилищеСущностей); КонецЕсли; Возврат ХранилищеСущностей; From bc30515944cea75ed3a509f5da289d416dc96200 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Nov 2018 17:05:05 +0300 Subject: [PATCH 04/25] =?UTF-8?q?#1=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=89=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 4304649..b53a9af 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -77,7 +77,12 @@ Для Каждого Колонка Из Колонки Цикл ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда - ХранилищеСущностейСсылки = ХранилищаСущностей.Получить(Колонка.ТипСсылки, Коннектор, СтрокаСоединения); + ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( + ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), + Коннектор, + СтрокаСоединения, + ПараметрыКоннектора + ); ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); КонецЕсли; ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); From 80c09e873617fde90dcbf9c457bff11b4ae78af8 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Nov 2018 17:05:46 +0300 Subject: [PATCH 05/25] =?UTF-8?q?#1=20=D0=97=D0=B0=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=20=D0=BF=D1=80=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 +- ...320\275\320\276\321\201\321\202\320\265\320\271.os" | 9 +++++++++ ...320\275\320\276\321\201\321\202\320\265\320\271.os" | 10 ++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index d59af12..b8fc18f 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -135,7 +135,7 @@ Коннектор.Закрыть(); КонецЕсли; МодельДанных.Очистить(); - // TODO: Закрыть все хранилища? + ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), СтрокаСоединенияКоннектора, ПараметрыКоннектора); КонецПроцедуры // Посылает коннектору запрос на начало транзакции. diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index b53a9af..084933c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -157,6 +157,15 @@ Возврат Коннектор; КонецФункции +Процедура Закрыть() Экспорт + + Если Коннектор.Открыт() Тогда + Коннектор.Закрыть(); + КонецЕсли; + ПулСущностей.Очистить(); + +КонецПроцедуры + // <Описание процедуры> // // Параметры: diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index bc92bcf..74948c0 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -14,4 +14,14 @@ КонецФункции +Процедура Закрыть(ТипКоннектора, СтрокаСоединения, ПараметрыКоннектора) Экспорт + // TODO: Сделать поиск, когда хранилища будут храниться в разрезе типов коннекторов и строк соединения + ЗакрываемыеХранилища = Хранилища; + Для Каждого КлючИЗначение Из ЗакрываемыеХранилища Цикл + Хранилище = КлючИЗначение.Значение; + Хранилище.Закрыть(); + КонецЦикла; + ЗакрываемыеХранилища.Очистить(); +КонецПроцедуры + Хранилища = Новый Соответствие(); From e78dfd1270f5d6cbf87e823d271a3be784449706 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Nov 2018 17:06:47 +0300 Subject: [PATCH 06/25] =?UTF-8?q?#1=20Shared=20in-memory=20database=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index afc6007..cda8904 100644 --- "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -3,7 +3,7 @@ Перем МенеджерСущностей; Процедура ПередЗапускомТеста() Экспорт - МенеджерСущностей = Новый МенеджерСущностей(Тип("КоннекторSQLite"), "Data Source=:memory:"); + МенеджерСущностей = Новый МенеджерСущностей(Тип("КоннекторSQLite"), "FullUri=file::memory:?cache=shared"); ПодключитьСценарий(ОбъединитьПути(ТекущийКаталог(), "tests", "fixtures", "Автор.os"), "Автор"); ПодключитьСценарий(ОбъединитьПути(ТекущийКаталог(), "tests", "fixtures", "СущностьБезГенерируемогоИдентификатора.os"), "СущностьБезГенерируемогоИдентификатора"); From 848c69920a95f1cdea5aabe9e996ac785dfa1886 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Nov 2018 17:10:05 +0300 Subject: [PATCH 07/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=20GC=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=20=D0=A1=D0=A3=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Особенно актуально для shared in-memory баз sqlite --- ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index b8fc18f..67f37eb 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -136,6 +136,8 @@ КонецЕсли; МодельДанных.Очистить(); ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), СтрокаСоединенияКоннектора, ПараметрыКоннектора); + // Для освобожения ссылок на все коннекторы и соединения с СУБД + ВыполнитьСборкуМусора(); КонецПроцедуры // Посылает коннектору запрос на начало транзакции. From 19bf6e2507fec858303fb0cc5c432b9e1de04db5 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Nov 2018 17:10:41 +0300 Subject: [PATCH 08/25] =?UTF-8?q?#1=20=D0=9E=D0=B1=D1=89=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2.=20=D0=A5=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20=D1=82=D0=B8=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.config | 1 + ...20\276\321\201\321\202\320\265\320\271.os" | 47 ++++++++++--------- ...20\276\321\201\321\202\320\265\320\271.os" | 7 ++- ...20\276\321\200\320\260\320\274\320\270.os" | 8 ++++ ...20\276\321\201\321\202\320\265\320\271.os" | 9 +++- 5 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" diff --git a/lib.config b/lib.config index a7a9d27..5f71737 100644 --- a/lib.config +++ b/lib.config @@ -8,5 +8,6 @@ + \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 67f37eb..2858ec2 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -25,14 +25,14 @@ ПроверитьПоддержкуИнтерфейсаКоннектора(ТипКоннектора); МодельДанных = Новый МодельДанных; - - Коннектор = Новый(ТипКоннектора); - + + Коннектор = РаботаСКоннекторами.СоздатьКоннектор(ТипКоннектора); + СтрокаСоединенияКоннектора = СтрокаСоединения; Если ППараметрыКоннектора = Неопределено Тогда ПараметрыКоннектора = Новый Массив; Иначе - ПараметрыКоннектора = ППараметрыКоннектора; + ПараметрыКоннектора = ППараметрыКоннектора; КонецЕсли; КонецПроцедуры @@ -43,14 +43,14 @@ // Процедура ДобавитьКлассВМодель(ТипСущности) Экспорт ПроверитьЧтоКлассЯвляетсяСущностью(ТипСущности); - + МодельДанных.СоздатьОбъектМодели(ТипСущности); КонецПроцедуры // Запускает процессы инициализации коннектора и таблиц БД. // Процедура Инициализировать() Экспорт - Коннектор.Открыть(СтрокаСоединенияКоннектора, ПараметрыКоннектора); + РаботаСКоннекторами.ОткрытьКоннектор(Коннектор, СтрокаСоединенияКоннектора, ПараметрыКоннектора); ОбъектыМодели = МодельДанных.ПолучитьОбъектыМодели(); Для Каждого ОбъектМодели Из ОбъектыМодели Цикл Коннектор.ИнициализироватьТаблицу(ОбъектМодели); @@ -73,13 +73,13 @@ // // Параметры: // ТипСущности - Тип - Тип искомой сущности. -// Отбор - Произвольный - Отбор для поиска. +// Отбор - Произвольный - Отбор для поиска. // Если параметр не задан или равен "Неопределено", то возвращаются все найденные сущности указанного типа. // Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска // ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. // Если параметр имеет тип "Массив", то каждое элемент массива должен иметь тип "ЭлементОтбора". // Каждый элемент отбора преобразуется к условию поиска. В качестве "ПутьКДанным" указываются имена полей. -// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. +// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. // В качестве "ПутьКДанным" указываются имена полей. // // Возвращаемое значение: @@ -87,7 +87,7 @@ // экземпляры класса с типом, равным переданному "ТипуСущности", с заполненными значениями полей. // Функция Получить(ТипСущности, Отбор = Неопределено) Экспорт - + ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); Возврат ХранилищеСущностей.Получить(Отбор); @@ -97,18 +97,18 @@ // // Параметры: // ТипСущности - Тип - Тип искомой сущности. -// Отбор - Произвольный - Отбор для поиска. +// Отбор - Произвольный - Отбор для поиска. // Если параметр не задан или равен "Неопределено", то возвращаются все найденные сущности указанного типа. // Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска. // ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. // Если параметр имеет тип "Массив", то каждое элемент массива должен иметь тип "ЭлементОтбора". // Каждый элемент отбора преобразуется к условию поиска. В качестве "ПутьКДанным" указываются имена полей. -// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. +// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. // В качестве "ПутьКДанным" указываются имена полей. // Любой другой тип интерпретируется как поиск по &Идентификатору. // // Возвращаемое значение: -// Произвольный - Если сущность была найдена, то возвращается экземпляр класса с типом, равным переданному +// Произвольный - Если сущность была найдена, то возвращается экземпляр класса с типом, равным переданному // "ТипуСущности", с заполненными значениями полей. Иначе возвращается "Неопределено". // Функция ПолучитьОдно(ТипСущности, Знач Отбор = Неопределено) Экспорт @@ -161,8 +161,8 @@ // Возвращает текущий активный коннектор. // // Возвращаемое значение: -// АбстрактныйКоннектор - Возвращает экземпляр коннектора. Конкретная реализация определяется параметром -// ТипКоннектора при вызове конструктора МенеджерСущностей. +// АбстрактныйКоннектор - Возвращает экземпляр коннектора. Конкретная реализация определяется параметром +// ТипКоннектора при вызове конструктора МенеджерСущностей. // Функция ПолучитьКоннектор() Экспорт Возврат Коннектор; @@ -170,7 +170,12 @@ Функция ПолучитьХранилищеСущностей(ТипСущности) Экспорт ОбъектМодели = МодельДанных.Получить(ТипСущности); - ХранилищеСущностей = ХранилищаСущностей.Получить(ОбъектМодели, Коннектор, СтрокаСоединенияКоннектора); + ХранилищеСущностей = ХранилищаСущностей.Получить( + ОбъектМодели, + ТипЗнч(Коннектор), + СтрокаСоединенияКоннектора, + ПараметрыКоннектора + ); Возврат ХранилищеСущностей; КонецФункции @@ -180,15 +185,15 @@ // ТипКоннектора - Тип - Тип, проверяемый на реализацию интерфейса // Процедура ПроверитьПоддержкуИнтерфейсаКоннектора(ТипКоннектора) - + ИнтерфейсКоннектор = Новый ИнтерфейсОбъекта; ИнтерфейсКоннектор.ИзОбъекта(Тип("АбстрактныйКоннектор")); РефлекторОбъекта = Новый РефлекторОбъекта(ТипКоннектора); ПоддерживаетсяИнтерфейсКоннектора = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсКоннектор); - + Ожидаем.Что( - ПоддерживаетсяИнтерфейсКоннектора, + ПоддерживаетсяИнтерфейсКоннектора, СтрШаблон("Тип <%1> не реализует интерфейс коннектора", ТипКоннектора) ).ЭтоИстина(); @@ -200,12 +205,12 @@ // ТипКласса - Тип - Тип, в котором проверяется наличие необходимых аннотаций. // Процедура ПроверитьЧтоКлассЯвляетсяСущностью(ТипКласса) - + РефлекторОбъекта = Новый РефлекторОбъекта(ТипКласса); ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов("Сущность", Ложь); Ожидаем.Что(ТаблицаМетодов, СтрШаблон("Класс %1 не имеет аннотации &Сущность", ТипКласса)).ИмеетДлину(1); - + ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств("Идентификатор"); Ожидаем.Что(ТаблицаСвойств, СтрШаблон("Класс %1 не имеет поля с аннотацией &Идентификатор", ТипКласса)).ИмеетДлину(1); - + КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 084933c..68664d6 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,13 +1,16 @@ Перем ОбъектМодели; Перем Коннектор; Перем СтрокаСоединения; +Перем ПараметрыКоннектора; Перем ПулСущностей; -Процедура ПриСозданииОбъекта(Знач ПОбъектМодели, Знач ПКоннектор, Знач ПСтрокаСоединения) +Процедура ПриСозданииОбъекта(Знач ПОбъектМодели, Знач ТипКоннектора, Знач ПСтрокаСоединения, ППараметрыКоннектора) ОбъектМодели = ПОбъектМодели; - Коннектор = ПКоннектор; + Коннектор = РаботаСКоннекторами.СоздатьКоннектор(ТипКоннектора); СтрокаСоединения = ПСтрокаСоединения; + ПараметрыКоннектора = ППараметрыКоннектора; + РаботаСКоннекторами.ОткрытьКоннектор(Коннектор, СтрокаСоединения, ПараметрыКоннектора); ПулСущностей = Новый Соответствие(); КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" new file mode 100644 index 0000000..d8ef474 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" @@ -0,0 +1,8 @@ +Функция СоздатьКоннектор(ТипКоннектора) Экспорт + Коннектор = Новый(ТипКоннектора); + Возврат Коннектор; +КонецФункции + +Процедура ОткрытьКоннектор(Коннектор, СтрокаСоединения, ПараметрыКоннектора) Экспорт + Коннектор.Открыть(СтрокаСоединения, ПараметрыКоннектора); +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 74948c0..a051e59 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,12 +1,17 @@ Перем Хранилища; -Функция Получить(ОбъектМодели, Коннектор, СтрокаСоединения) Экспорт +Функция Получить(ОбъектМодели, ТипКоннектора, СтрокаСоединения, ПараметрыКоннектора) Экспорт // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения // TODO: synchronized/mutex: ХранилищеСущностей = Хранилища.Получить(ОбъектМодели.ТипСущности()); Если ХранилищеСущностей = Неопределено Тогда - ХранилищеСущностей = Новый ХранилищеСущностей(ОбъектМодели, Коннектор, СтрокаСоединения); + ХранилищеСущностей = Новый ХранилищеСущностей( + ОбъектМодели, + ТипКоннектора, + СтрокаСоединения, + ПараметрыКоннектора + ); Хранилища.Вставить(ОбъектМодели.ТипСущности(), ХранилищеСущностей); КонецЕсли; From 107bdc86dc3edd08ee952e1320df7104d11db88c Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Sat, 10 Nov 2018 22:20:49 +0700 Subject: [PATCH 09/25] =?UTF-8?q?Fix=20#19.=20=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=D0=B0=D0=BC=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BD=D0=B0=20=D1=81=D0=B5=D0=B1=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\275\320\276\321\201\321\202\320\265\320\271.os" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 68664d6..608ef17 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -75,11 +75,20 @@ КонецЕсли; Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + ЗначениеИдентификатора = НайденнаяСтрока.Получить(ОбъектМодели.Идентификатор().ИмяКолонки); + ЗначениеИдентификатора = ОбъектМодели.ПривестиЗначениеПоля( + ЗначениеИдентификатора, + ОбъектМодели.Идентификатор().ИмяПоля + ); Сущность = Новый(ОбъектМодели.ТипСущности()); Для Каждого Колонка Из Колонки Цикл ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда + + Если Колонка.ТипСсылки = ОбъектМодели.ТипСущности() И ЗначениеКолонки = ЗначениеИдентификатора Тогда + ЗначениеКолонки = Сущность; + Иначе ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), Коннектор, @@ -88,6 +97,7 @@ ); ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); КонецЕсли; + КонецЕсли; ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); КонецЦикла; From 0f9c11f06c7d051eaaaab7cb78e441e210245897 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Sat, 10 Nov 2018 22:21:18 +0700 Subject: [PATCH 10/25] =?UTF-8?q?Fix=20#18.=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=8B=20=D1=81=20=D0=BE=D0=B4=D0=B8=D0=BD=D0=B0=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=BD=D0=B0=20=D1=81=D1=83=D1=89=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\276\321\201\321\202\320\265\320\271.os" | 24 +++++++++++-------- ...20\276\321\201\321\202\320\265\320\271.os" | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 608ef17..cee2556 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -80,8 +80,12 @@ ЗначениеИдентификатора, ОбъектМодели.Идентификатор().ИмяПоля ); - Сущность = Новый(ОбъектМодели.ТипСущности()); - + Сущность = ПулСущностей.Получить(ЗначениеИдентификатора); + Если Сущность = Неопределено Тогда + Сущность = Новый(ОбъектМодели.ТипСущности()); + ПулСущностей.Вставить(ЗначениеИдентификатора, Сущность); + КонецЕсли; + Для Каждого Колонка Из Колонки Цикл ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда @@ -89,14 +93,14 @@ Если Колонка.ТипСсылки = ОбъектМодели.ТипСущности() И ЗначениеКолонки = ЗначениеИдентификатора Тогда ЗначениеКолонки = Сущность; Иначе - ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( - ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), - Коннектор, - СтрокаСоединения, - ПараметрыКоннектора - ); - ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); - КонецЕсли; + ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( + ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), + Коннектор, + СтрокаСоединения, + ПараметрыКоннектора + ); + ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); + КонецЕсли; КонецЕсли; ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); КонецЦикла; diff --git "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index cda8904..26fe091 100644 --- "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -268,7 +268,7 @@ Сущность = Новый СущностьСоВсемиТипамиКолонок; Сущность.Целое = 1; - //Сущность.Ссылка = Сущность; + Сущность.Ссылка = Сущность; МенеджерСущностей.Сохранить(Сущность); Сущность1 = МенеджерСущностей.ПолучитьОдно(Тип("СущностьСоВсемиТипамиКолонок"), 1); From 731f509b95c9c012bc1d5c54a7837569486c4413 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Sat, 10 Nov 2018 22:21:52 +0700 Subject: [PATCH 11/25] Fix QF --- packagedef | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packagedef b/packagedef index 59c69eb..18f04c6 100644 --- a/packagedef +++ b/packagedef @@ -3,7 +3,6 @@ // Полную документацию см. на hub.oscript.io/packaging // - Описание.Имя("entity") .Версия("2.2.0.0") .Автор("Nikita Gryzlov") @@ -20,7 +19,4 @@ .ЗависитОт("reflector", "0.6.0") .ЗависитОт("sql", "1.1.0.0") .ЗависитОт("strings", "0.4.1") - //.ЗависитОт("package2", ">=1.1", "<2.0") - //.ОпределяетКласс("УправлениеВселенной", "src/universe-mngr.os") - //.ОпределяетМодуль("ПолезныеФункции", "src/tools.os") ; From 70fa41b32dbb4c15cd23f323aa62fed820926b9d Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 22 Nov 2018 13:34:21 +0700 Subject: [PATCH 12/25] =?UTF-8?q?=D0=A2=D0=B0=D1=81=D0=BA=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BA=D0=BE=D0=B4-=D0=BA?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D1=80=D0=B5=D0=B4=D0=B6=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ tasks/coverage.os | 33 +++++++++++++++++++++++++++++++++ tasks/test.os | 27 +++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 tasks/coverage.os create mode 100644 tasks/test.os diff --git a/.gitignore b/.gitignore index e57a416..ffcf25b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.db *.ospx + +coverage/ +tests.xml diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..9c6d1d1 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,33 @@ +#Использовать 1commands +#Использовать fs +#Использовать coverage + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +ФС.ОбеспечитьПустойКаталог("coverage"); +ПутьКСтат = "coverage/stat.json"; + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); + +Файл_Стат = Новый Файл(ПутьКСтат); + +ИмяПакета = "oscript-package"; + +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); + +ПроцессорГенерации.ОтносительныеПути() + .ФайлСтатистики(Файл_Стат.ПолноеИмя) + .Cobertura() // Формирование отчета в формате Cobertura + .Сформировать(); + +ЗавершитьРаботу(КодВозврата); \ No newline at end of file diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..996d8d6 --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,27 @@ +#Использовать ".." +#Использовать 1testrunner + +Функция ПрогнатьТесты() + + Тестер = Новый Тестер; + + ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); + ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); + + КаталогТестов = Новый Файл(ПутьКТестам); + Если Не КаталогТестов.Существует() Тогда + Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам)); + Возврат Истина; + КонецЕсли; + + РезультатТестирования = Тестер.ТестироватьКаталог( + КаталогТестов, + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; +КонецФункции // ПрогнатьТесты() + +ПрогнатьТесты(); From d58cba6c5a4ff80420f6d46e2c47209e5e9a4972 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 22 Nov 2018 13:35:04 +0700 Subject: [PATCH 13/25] =?UTF-8?q?=D0=A2=D1=80=D0=B5=D0=B1=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\320\265\320\272\321\202\320\276\321\200.os" | 12 ++++++++++++ ...20\265\320\272\321\202\320\276\321\200SQLite.os" | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" index f180959..94ae3ce 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" @@ -1,5 +1,7 @@ // Для хранения статуса соединения Перем Открыт; +Перем мСтрокаСоединения; +Перем мПараметрыКоннектора; // Конструктор объекта АбстрактныйКоннектор. // @@ -7,6 +9,14 @@ Открыт = Ложь; КонецПроцедуры +Функция ПолучитьСтрокуСоединения() Экспорт + Возврат мСтрокаСоединения; +КонецФункции + +Функция ПолучитьПараметрыКоннектора() Экспорт + Возврат мПараметрыКоннектора; +КонецФункции + // Открыть соединение с БД. // // Параметры: @@ -14,6 +24,8 @@ // ПараметрыКоннектора - Массив - Дополнительные параметры инициализиации коннектора. // Процедура Открыть(СтрокаСоединения, ПараметрыКоннектора) Экспорт + мСтрокаСоединения = СтрокаСоединения; + мПараметрыКоннектора = ПараметрыКоннектора; Открыт = Истина; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" index ef608c0..c0b19d7 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" @@ -5,6 +5,8 @@ #Использовать strings Перем Соединение; +Перем мСтрокаСоединения; +Перем мПараметрыКоннектора; Перем Лог; @@ -15,6 +17,14 @@ Лог = Логирование.ПолучитьЛог("oscript.lib.entity.connector.sqlite"); КонецПроцедуры +Функция ПолучитьСтрокуСоединения() Экспорт + Возврат мСтрокаСоединения; +КонецФункции + +Функция ПолучитьПараметрыКоннектора() Экспорт + Возврат мПараметрыКоннектора; +КонецФункции + // Открыть соединение с БД. // // Параметры: @@ -22,6 +32,9 @@ // ПараметрыКоннектора - Массив - Дополнительные параметры инициализиации коннектора. // Процедура Открыть(СтрокаСоединения, ПараметрыКоннектора) Экспорт + мСтрокаСоединения = СтрокаСоединения; + мПараметрыКоннектора = ПараметрыКоннектора; + Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; Соединение.СтрокаСоединения = СтрокаСоединения; Соединение.Открыть(); From a8ac3ccbee35b9d985ab953895bdd7b8784f97e2 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 22 Nov 2018 13:35:46 +0700 Subject: [PATCH 14/25] =?UTF-8?q?#18=20#1=20=D0=92=D1=8B=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B0=D0=BC=D0=B8=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C.=20=D0=A0=D0=B5=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D1=81=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\276\321\201\321\202\320\265\320\271.os" | 41 ++-- ...20\276\321\201\321\202\320\265\320\271.os" | 176 ++-------------- ...20\276\321\200\320\260\320\274\320\270.os" | 190 ++++++++++++++++++ ...20\276\321\201\321\202\320\265\320\271.os" | 8 +- 4 files changed, 230 insertions(+), 185 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 2858ec2..eb99938 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -64,9 +64,9 @@ // Процедура Сохранить(Сущность) Экспорт ТипСущности = ТипЗнч(Сущность); - - ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); - ХранилищеСущностей.Сохранить(Сущность); + ОбъектМодели = МодельДанных.Получить(ТипСущности); + ПулСущностей = ПолучитьПулСущностей(ТипСущности); + РаботаСКоннекторами.Сохранить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры // Осуществляет поиск сущностей переданного типа по идентификатору. @@ -87,10 +87,9 @@ // экземпляры класса с типом, равным переданному "ТипуСущности", с заполненными значениями полей. // Функция Получить(ТипСущности, Отбор = Неопределено) Экспорт - - ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); - Возврат ХранилищеСущностей.Получить(Отбор); - + ОбъектМодели = МодельДанных.Получить(ТипСущности); + ПулСущностей = ПолучитьПулСущностей(ТипСущности); + Возврат РаботаСКоннекторами.Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции // Осуществляет поиск сущности переданного типа по идентификатору. @@ -112,8 +111,9 @@ // "ТипуСущности", с заполненными значениями полей. Иначе возвращается "Неопределено". // Функция ПолучитьОдно(ТипСущности, Знач Отбор = Неопределено) Экспорт - ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); - Возврат ХранилищеСущностей.ПолучитьОдно(Отбор); + ОбъектМодели = МодельДанных.Получить(ТипСущности); + ПулСущностей = ПолучитьПулСущностей(ТипСущности); + Возврат РаботаСКоннекторами.ПолучитьОдно(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции // Удаляет удаление сущности из базы данных. @@ -124,16 +124,15 @@ // Процедура Удалить(Сущность) Экспорт ТипСущности = ТипЗнч(Сущность); - ХранилищеСущностей = ПолучитьХранилищеСущностей(ТипСущности); - ХранилищеСущностей.Удалить(Сущность); + ОбъектМодели = МодельДанных.Получить(ТипСущности); + ПулСущностей = ПолучитьПулСущностей(ТипСущности); + РаботаСКоннекторами.Удалить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры // Посылает коннектору запрос на закрытие соединения. // Процедура Закрыть() Экспорт - Если Коннектор.Открыт() Тогда - Коннектор.Закрыть(); - КонецЕсли; + РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); МодельДанных.Очистить(); ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), СтрокаСоединенияКоннектора, ПараметрыКоннектора); // Для освобожения ссылок на все коннекторы и соединения с СУБД @@ -143,19 +142,19 @@ // Посылает коннектору запрос на начало транзакции. // Процедура НачатьТранзакцию() Экспорт - Коннектор.НачатьТранзакцию(); + РаботаСКоннекторами.НачатьТранзакцию(Коннектор); КонецПроцедуры // Посылает коннектору запрос на фиксацию транзакции. // Процедура ЗафиксироватьТранзакцию() Экспорт - Коннектор.ЗафиксироватьТранзакцию(); + РаботаСКоннекторами.ЗафиксироватьТранзакцию(Коннектор); КонецПроцедуры // Посылает коннектору запрос на отмену транзакции. // Процедура ОтменитьТранзакцию() Экспорт - Коннектор.ОтменитьТранзакцию(); + РаботаСКоннекторами.ОтменитьТранзакцию(Коннектор); КонецПроцедуры // Возвращает текущий активный коннектор. @@ -172,13 +171,15 @@ ОбъектМодели = МодельДанных.Получить(ТипСущности); ХранилищеСущностей = ХранилищаСущностей.Получить( ОбъектМодели, - ТипЗнч(Коннектор), - СтрокаСоединенияКоннектора, - ПараметрыКоннектора + Коннектор ); Возврат ХранилищеСущностей; КонецФункции +Функция ПолучитьПулСущностей(ТипСущности) Экспорт + Возврат ПолучитьХранилищеСущностей(ТипСущности).ПолучитьПулСущностей(); +КонецФункции + // <Описание процедуры> // // Параметры: diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index cee2556..3e836ac 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,139 +1,25 @@ Перем ОбъектМодели; Перем Коннектор; -Перем СтрокаСоединения; -Перем ПараметрыКоннектора; Перем ПулСущностей; -Процедура ПриСозданииОбъекта(Знач ПОбъектМодели, Знач ТипКоннектора, Знач ПСтрокаСоединения, ППараметрыКоннектора) +Процедура ПриСозданииОбъекта(Знач ПОбъектМодели, Знач ТипКоннектора, Знач СтрокаСоединения, ПараметрыКоннектора) ОбъектМодели = ПОбъектМодели; Коннектор = РаботаСКоннекторами.СоздатьКоннектор(ТипКоннектора); - СтрокаСоединения = ПСтрокаСоединения; - ПараметрыКоннектора = ППараметрыКоннектора; РаботаСКоннекторами.ОткрытьКоннектор(Коннектор, СтрокаСоединения, ПараметрыКоннектора); ПулСущностей = Новый Соответствие(); КонецПроцедуры -Функция Сохранить(Сущность) Экспорт - ТипСущности = ТипЗнч(Сущность); - - ПроверитьЧтоКлассЯвляетсяСущностью(ТипСущности); - ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности); - ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность); - - Коннектор.Сохранить(ОбъектМодели, Сущность); - - ПулСущностей.Вставить(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность), Сущность); -КонецФункции +Процедура Сохранить(Сущность) Экспорт + РаботаСКоннекторами.Сохранить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); +КонецПроцедуры Функция Получить(Отбор = Неопределено) Экспорт - Колонки = ОбъектМодели.Колонки(); - - ПередаваемыйОтбор = Новый Массив; - - Если ТипЗнч(Отбор) = Тип("Соответствие") Тогда - // Переформируем ключи отбора из имен полей в имена колонок - Для Каждого КлючИЗначение Из Отбор Цикл - Колонка = Колонки.Найти(КлючИЗначение.Ключ, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", КлючИЗначение.Ключ) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ВидСравнения.Равно, КлючИЗначение.Значение)); - КонецЦикла; - ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда - Для Каждого ЭлементОтбора Из Отбор Цикл - Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); - КонецЦикла; - ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда - ЭлементОтбора = Отбор; - Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); - Ожидаем.Что( - Колонка, - СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) - ).Не_().Равно(Неопределено); - - ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); - ИначеЕсли Отбор = Неопределено Тогда - // no-op - Иначе - ВызватьИсключение "В метод получения данных передан неожиданный тип отбора: " + ТипЗнч(Отбор); - КонецЕсли; - - НайденныеСущности = Новый Массив; - - НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор); - Если НайденныеСтроки.Количество() = 0 Тогда - Возврат НайденныеСущности; - КонецЕсли; - - Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл - ЗначениеИдентификатора = НайденнаяСтрока.Получить(ОбъектМодели.Идентификатор().ИмяКолонки); - ЗначениеИдентификатора = ОбъектМодели.ПривестиЗначениеПоля( - ЗначениеИдентификатора, - ОбъектМодели.Идентификатор().ИмяПоля - ); - Сущность = ПулСущностей.Получить(ЗначениеИдентификатора); - Если Сущность = Неопределено Тогда - Сущность = Новый(ОбъектМодели.ТипСущности()); - ПулСущностей.Вставить(ЗначениеИдентификатора, Сущность); - КонецЕсли; - - Для Каждого Колонка Из Колонки Цикл - ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); - Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда - - Если Колонка.ТипСсылки = ОбъектМодели.ТипСущности() И ЗначениеКолонки = ЗначениеИдентификатора Тогда - ЗначениеКолонки = Сущность; - Иначе - ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( - ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), - Коннектор, - СтрокаСоединения, - ПараметрыКоннектора - ); - ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); - КонецЕсли; - КонецЕсли; - ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); - КонецЦикла; - - НайденныеСущности.Добавить(Сущность); - КонецЦикла; - - Возврат НайденныеСущности; + Возврат РаботаСКоннекторами.Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции Функция ПолучитьОдно(Знач Отбор = Неопределено) Экспорт - - Если Отбор = Неопределено Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("Соответствие") Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда - ПередаваемыйОтбор = Отбор; - ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда - ПередаваемыйОтбор = Отбор; - Иначе - ПередаваемыйОтбор = Новый Соответствие(); - ПередаваемыйОтбор.Вставить(ОбъектМодели.Идентификатор().ИмяПоля, Отбор); - КонецЕсли; - - НайденныеСущности = Получить(ПередаваемыйОтбор); - - Если НайденныеСущности.Количество() = 0 Тогда - Возврат Неопределено; - Иначе - Возврат НайденныеСущности[0]; - КонецЕсли; - + Возврат РаботаСКоннекторами.ПолучитьОдно(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции // Удаляет удаление сущности из базы данных. @@ -143,25 +29,25 @@ // Сущность - Произвольный - Удаляемая сущность // Процедура Удалить(Сущность) Экспорт - Коннектор.Удалить(ОбъектМодели, Сущность); + РаботаСКоннекторами.Удалить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры // Посылает коннектору запрос на начало транзакции. // Процедура НачатьТранзакцию() Экспорт - Коннектор.НачатьТранзакцию(); + РаботаСКоннекторами.НачатьТранзакцию(Коннектор); КонецПроцедуры // Посылает коннектору запрос на фиксацию транзакции. // Процедура ЗафиксироватьТранзакцию() Экспорт - Коннектор.ЗафиксироватьТранзакцию(); + РаботаСКоннекторами.ЗафиксироватьТранзакцию(Коннектор); КонецПроцедуры // Посылает коннектору запрос на отмену транзакции. // Процедура ОтменитьТранзакцию() Экспорт - Коннектор.ОтменитьТранзакцию(); + РаботаСКоннекторами.ОтменитьТранзакцию(Коннектор); КонецПроцедуры // Возвращает текущий активный коннектор. @@ -175,43 +61,11 @@ КонецФункции Процедура Закрыть() Экспорт - - Если Коннектор.Открыт() Тогда - Коннектор.Закрыть(); - КонецЕсли; + РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); ПулСущностей.Очистить(); - -КонецПроцедуры - -// <Описание процедуры> -// -// Параметры: -// ТипКласса - Тип - Тип, в котором проверяется наличие необходимых аннотаций. -// -Процедура ПроверитьЧтоКлассЯвляетсяСущностью(ТипКласса) - - РефлекторОбъекта = Новый РефлекторОбъекта(ТипКласса); - ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов("Сущность", Ложь); - Ожидаем.Что(ТаблицаМетодов, СтрШаблон("Класс %1 не имеет аннотации &Сущность", ТипКласса)).ИмеетДлину(1); - - ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств("Идентификатор"); - Ожидаем.Что(ТаблицаСвойств, СтрШаблон("Класс %1 не имеет поля с аннотацией &Идентификатор", ТипКласса)).ИмеетДлину(1); - -КонецПроцедуры - -Процедура ПроверитьЧтоТипСущностиЗарегистрированВМодели(ТипСущности) - // TODO: проверка должна быть в момент получения репозитория - Ожидаем.Что(ОбъектМодели, "Тип сущности не зарегистрирован в модели данных").Не_().Равно(Неопределено); КонецПроцедуры -Процедура ПроверитьНеобходимостьЗаполненияИдентификатора(Сущность) - Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда - Возврат; - КонецЕсли; - - ЗначениеИдентификатора = ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность); - Ожидаем.Что( - ЗначениеИдентификатора, СтрШаблон("Сущность с типом %1 должна иметь заполненный идентификатор", Тип(Сущность)) - ).Заполнено(); - -КонецПроцедуры +// @internal +Функция ПолучитьПулСущностей() Экспорт + Возврат ПулСущностей; +КонецФункции diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" index d8ef474..3b28784 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" @@ -1,3 +1,5 @@ +#Использовать asserts + Функция СоздатьКоннектор(ТипКоннектора) Экспорт Коннектор = Новый(ТипКоннектора); Возврат Коннектор; @@ -6,3 +8,191 @@ Процедура ОткрытьКоннектор(Коннектор, СтрокаСоединения, ПараметрыКоннектора) Экспорт Коннектор.Открыть(СтрокаСоединения, ПараметрыКоннектора); КонецПроцедуры + +Процедура ЗакрытьКоннектор(Коннектор) Экспорт + Если Коннектор.Открыт() Тогда + Коннектор.Закрыть(); + КонецЕсли; +КонецПроцедуры + +Функция Сохранить(Коннектор, ОбъектМодели, ПулСущностей, Сущность) Экспорт + ТипСущности = ТипЗнч(Сущность); + + ПроверитьЧтоКлассЯвляетсяСущностью(ТипСущности); + ПроверитьЧтоТипСущностиЗарегистрированВМодели(ОбъектМодели); + ПроверитьНеобходимостьЗаполненияИдентификатора(ОбъектМодели, Сущность); + + Коннектор.Сохранить(ОбъектМодели, Сущность); + + ПулСущностей.Вставить(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность), Сущность); +КонецФункции + +Функция Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор = Неопределено) Экспорт + Колонки = ОбъектМодели.Колонки(); + + ПередаваемыйОтбор = Новый Массив; + + Если ТипЗнч(Отбор) = Тип("Соответствие") Тогда + // Переформируем ключи отбора из имен полей в имена колонок + Для Каждого КлючИЗначение Из Отбор Цикл + Колонка = Колонки.Найти(КлючИЗначение.Ключ, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", КлючИЗначение.Ключ) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ВидСравнения.Равно, КлючИЗначение.Значение)); + КонецЦикла; + ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда + Для Каждого ЭлементОтбора Из Отбор Цикл + Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); + КонецЦикла; + ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда + ЭлементОтбора = Отбор; + Колонка = Колонки.Найти(ЭлементОтбора.ПутьКДанным, "ИмяПоля"); + Ожидаем.Что( + Колонка, + СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементОтбора.ПутьКДанным) + ).Не_().Равно(Неопределено); + + ПередаваемыйОтбор.Добавить(Новый ЭлементОтбора(Колонка.ИмяКолонки, ЭлементОтбора.ВидСравнения, ЭлементОтбора.Значение)); + ИначеЕсли Отбор = Неопределено Тогда + // no-op + Иначе + ВызватьИсключение "В метод получения данных передан неожиданный тип отбора: " + ТипЗнч(Отбор); + КонецЕсли; + + НайденныеСущности = Новый Массив; + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат НайденныеСущности; + КонецЕсли; + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + ЗначениеИдентификатора = НайденнаяСтрока.Получить(ОбъектМодели.Идентификатор().ИмяКолонки); + ЗначениеИдентификатора = ОбъектМодели.ПривестиЗначениеПоля( + ЗначениеИдентификатора, + ОбъектМодели.Идентификатор().ИмяПоля + ); + Сущность = ПулСущностей.Получить(ЗначениеИдентификатора); + Если Сущность = Неопределено Тогда + Сущность = Новый(ОбъектМодели.ТипСущности()); + ПулСущностей.Вставить(ЗначениеИдентификатора, Сущность); + КонецЕсли; + + Для Каждого Колонка Из Колонки Цикл + ЗначениеКолонки = НайденнаяСтрока.Получить(Колонка.ИмяКолонки); + Если Колонка.ТипКолонки = ТипыКолонок.Ссылка И ЗначениеЗаполнено(ЗначениеКолонки) Тогда + + Если Колонка.ТипСсылки = ОбъектМодели.ТипСущности() И ЗначениеКолонки = ЗначениеИдентификатора Тогда + ЗначениеКолонки = Сущность; + Иначе + ХранилищеСущностейСсылки = ХранилищаСущностей.Получить( + ОбъектМодели.МодельДанных().Получить(Колонка.ТипСсылки), + Коннектор + ); + ЗначениеКолонки = ХранилищеСущностейСсылки.ПолучитьОдно(ЗначениеКолонки); + КонецЕсли; + КонецЕсли; + ОбъектМодели.УстановитьЗначениеКолонкиВПоле(Сущность, Колонка.ИмяКолонки, ЗначениеКолонки); + КонецЦикла; + + НайденныеСущности.Добавить(Сущность); + КонецЦикла; + + Возврат НайденныеСущности; +КонецФункции + +Функция ПолучитьОдно(Коннектор, ОбъектМодели, ПулСущностей, Знач Отбор = Неопределено) Экспорт + + Если Отбор = Неопределено Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("Соответствие") Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("Массив") Тогда + ПередаваемыйОтбор = Отбор; + ИначеЕсли ТипЗнч(Отбор) = Тип("ЭлементОтбора") Тогда + ПередаваемыйОтбор = Отбор; + Иначе + ПередаваемыйОтбор = Новый Соответствие(); + ПередаваемыйОтбор.Вставить(ОбъектМодели.Идентификатор().ИмяПоля, Отбор); + КонецЕсли; + + НайденныеСущности = Получить(Коннектор, ОбъектМодели, ПулСущностей, ПередаваемыйОтбор); + + Если НайденныеСущности.Количество() = 0 Тогда + Возврат Неопределено; + Иначе + Возврат НайденныеСущности[0]; + КонецЕсли; + +КонецФункции + +// Удаляет удаление сущности из базы данных. +// Сущность должна иметь заполненный идентификатор. +// +// Параметры: +// Сущность - Произвольный - Удаляемая сущность +// +Процедура Удалить(Коннектор, ОбъектМодели, ПулСущностей, Сущность) Экспорт + Коннектор.Удалить(ОбъектМодели, Сущность); + ПулСущностей.Удалить(Сущность); +КонецПроцедуры + +// Посылает коннектору запрос на начало транзакции. +// +Процедура НачатьТранзакцию(Коннектор) Экспорт + Коннектор.НачатьТранзакцию(); +КонецПроцедуры + +// Посылает коннектору запрос на фиксацию транзакции. +// +Процедура ЗафиксироватьТранзакцию(Коннектор) Экспорт + Коннектор.ЗафиксироватьТранзакцию(); +КонецПроцедуры + +// Посылает коннектору запрос на отмену транзакции. +// +Процедура ОтменитьТранзакцию(Коннектор) Экспорт + Коннектор.ОтменитьТранзакцию(); +КонецПроцедуры + +// <Описание процедуры> +// +// Параметры: +// ТипКласса - Тип - Тип, в котором проверяется наличие необходимых аннотаций. +// +Процедура ПроверитьЧтоКлассЯвляетсяСущностью(ТипКласса) + + РефлекторОбъекта = Новый РефлекторОбъекта(ТипКласса); + ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов("Сущность", Ложь); + Ожидаем.Что(ТаблицаМетодов, СтрШаблон("Класс %1 не имеет аннотации &Сущность", ТипКласса)).ИмеетДлину(1); + + ТаблицаСвойств = РефлекторОбъекта.ПолучитьТаблицуСвойств("Идентификатор"); + Ожидаем.Что(ТаблицаСвойств, СтрШаблон("Класс %1 не имеет поля с аннотацией &Идентификатор", ТипКласса)).ИмеетДлину(1); + +КонецПроцедуры + +Процедура ПроверитьЧтоТипСущностиЗарегистрированВМодели(ОбъектМодели) + // TODO: проверка должна быть в момент получения репозитория + Ожидаем.Что(ОбъектМодели, "Тип сущности не зарегистрирован в модели данных").Не_().Равно(Неопределено); +КонецПроцедуры + +Процедура ПроверитьНеобходимостьЗаполненияИдентификатора(ОбъектМодели, Сущность) + Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда + Возврат; + КонецЕсли; + + ЗначениеИдентификатора = ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность); + Ожидаем.Что( + ЗначениеИдентификатора, СтрШаблон("Сущность с типом %1 должна иметь заполненный идентификатор", Тип(Сущность)) + ).Заполнено(); + +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index a051e59..d385b2e 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,6 +1,6 @@ Перем Хранилища; -Функция Получить(ОбъектМодели, ТипКоннектора, СтрокаСоединения, ПараметрыКоннектора) Экспорт +Функция Получить(ОбъектМодели, Коннектор) Экспорт // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения // TODO: synchronized/mutex: @@ -8,9 +8,9 @@ Если ХранилищеСущностей = Неопределено Тогда ХранилищеСущностей = Новый ХранилищеСущностей( ОбъектМодели, - ТипКоннектора, - СтрокаСоединения, - ПараметрыКоннектора + ТипЗнч(Коннектор), + Коннектор.ПолучитьСтрокуСоединения(), + Коннектор.ПолучитьПараметрыКоннектора() ); Хранилища.Вставить(ОбъектМодели.ТипСущности(), ХранилищеСущностей); КонецЕсли; From 21550aa9401d4ab0615029eeabb831fbc4099988 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 22 Nov 2018 15:04:40 +0700 Subject: [PATCH 15/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B8=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20semaphore=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D1=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 1 + ...1\320\275\320\276\321\201\321\202\320\265\320\271.os" | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packagedef b/packagedef index 18f04c6..6d31d4e 100644 --- a/packagedef +++ b/packagedef @@ -17,6 +17,7 @@ .ЗависитОт("asserts", "1.1.1") .ЗависитОт("logos", "1.2.0") .ЗависитОт("reflector", "0.6.0") + .ЗависитОт("semaphore", "1.0.0") .ЗависитОт("sql", "1.1.0.0") .ЗависитОт("strings", "0.4.1") ; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index d385b2e..21468f0 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,9 +1,13 @@ +#Использовать semaphore + Перем Хранилища; +Перем Семафор; Функция Получить(ОбъектМодели, Коннектор) Экспорт // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения - // TODO: synchronized/mutex: + Семафор.Захватить(); + ХранилищеСущностей = Хранилища.Получить(ОбъектМодели.ТипСущности()); Если ХранилищеСущностей = Неопределено Тогда ХранилищеСущностей = Новый ХранилищеСущностей( @@ -14,6 +18,8 @@ ); Хранилища.Вставить(ОбъектМодели.ТипСущности(), ХранилищеСущностей); КонецЕсли; + + Семафор.Освободить(); Возврат ХранилищеСущностей; @@ -30,3 +36,4 @@ КонецПроцедуры Хранилища = Новый Соответствие(); +Семафор = Новый Семафор(1); From be4bd109a1c80f32f2f6d9eb051e2bd610ee34e9 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 22 Nov 2018 15:25:06 +0700 Subject: [PATCH 16/25] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B5=D0=B7?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20semaphore=201.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 2 +- ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packagedef b/packagedef index 6d31d4e..f1adafb 100644 --- a/packagedef +++ b/packagedef @@ -17,7 +17,7 @@ .ЗависитОт("asserts", "1.1.1") .ЗависитОт("logos", "1.2.0") .ЗависитОт("reflector", "0.6.0") - .ЗависитОт("semaphore", "1.0.0") + .ЗависитОт("semaphore", "1.0.1") .ЗависитОт("sql", "1.1.0.0") .ЗависитОт("strings", "0.4.1") ; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 21468f0..c32518b 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -36,4 +36,4 @@ КонецПроцедуры Хранилища = Новый Соответствие(); -Семафор = Новый Семафор(1); +Семафор = Новый Семафор(); From c1f5ca850a37a51568312c690c7985f9774fd45d Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 11:45:09 +0700 Subject: [PATCH 17/25] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20internal=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.config | 2 -- ...\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" | 0 ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 0 ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 ++ ...\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" | 2 ++ 5 files changed, 4 insertions(+), 2 deletions(-) rename "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" => "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" (100%) rename "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" => "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" (100%) diff --git a/lib.config b/lib.config index 5f71737..e2ae8f6 100644 --- a/lib.config +++ b/lib.config @@ -8,6 +8,4 @@ - - \ No newline at end of file diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" rename to "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" rename to "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index eb99938..b781a41 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,3 +1,5 @@ +#Использовать "../internal" + #Использовать asserts #Использовать logos #Использовать reflector diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 3e836ac..a6f3472 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -1,3 +1,5 @@ +#Использовать "../internal" + Перем ОбъектМодели; Перем Коннектор; Перем ПулСущностей; From 1096293ef536ab8ece4179f3d04bc6e894a8d9c4 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 11:45:38 +0700 Subject: [PATCH 18/25] =?UTF-8?q?=D0=A1=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D0=B2=20?= =?UTF-8?q?README=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=A5=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=89=D0=B5=D0=A1=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D0=B4=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ddbc755..7717f5f 100644 --- a/README.md +++ b/README.md @@ -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) @@ -294,13 +293,24 @@ Под контроль и обязательство соблюдения обратной совместимости попадают: * для Major.Entity: - * все публичные методы классов "МенеджерСущности", "МодельДанных", "ОбъектМодели", "ЭлементОтбора", непомеченные как нестабильные (`@unstable`) в описании метода; - * значения модулей-перечислений "ТипыКолонок" и "ВидСравнения"; + * все публичные непомеченные как нестабильные (`@unstable`) методы классов: + * [`МенеджерСущности`](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... From 6a1e72cc2e75d2edadc5424ce69530b54707fb97 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 12:01:17 +0700 Subject: [PATCH 19/25] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20API=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=83=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D1=85=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- ...20\276\321\201\321\202\320\265\320\271.os" | 24 +++++++- ...20\276\321\201\321\202\320\265\320\271.os" | 61 +++++++++++++++++-- 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7717f5f..0a9d2f3 100644 --- a/README.md +++ b/README.md @@ -293,7 +293,7 @@ Под контроль и обязательство соблюдения обратной совместимости попадают: * для Major.Entity: - * все публичные непомеченные как нестабильные (`@unstable`) методы классов: + * все публичные непомеченные как "нестабильные" (`@unstable`) или "для служебного использования" (`@internal`) методы классов: * [`МенеджерСущности`](src/Классы/МенеджерСущностей.os), * [`ХранилищеСущностей`](src/Классы/ХранилищеСущностей.os), * [`МодельДанных`](src/Классы/МодельДанных.os), @@ -305,7 +305,7 @@ * состав и параметры аннотаций сущностей; * для Major.Connector: * все публичные методы класса [`АбстрактныйКоннектор`](src/Классы/АбстрактныйКоннектор.os) и их сигнатуры; - * все публичные непомеченные как нестабильные (`@unstable`) методы классов: + * все публичные непомеченные как "нестабильные" (`@unstable`) методы классов: * [`МодельДанных`](src/Классы/МодельДанных.os), * [`ОбъектМодели`](src/Классы/ОбъектМодели.os), * [`ЭлементОтбора`](src/Классы/ЭлементОтбора.os); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index b781a41..ae3fd81 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -118,7 +118,7 @@ Возврат РаботаСКоннекторами.ПолучитьОдно(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции -// Удаляет удаление сущности из базы данных. +// Выполняет удаление сущности из базы данных. // Сущность должна иметь заполненный идентификатор. // // Параметры: @@ -131,7 +131,8 @@ РаботаСКоннекторами.Удалить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры -// Посылает коннектору запрос на закрытие соединения. +// Выполняет очистку полную данных библиотеки. +// Дополнительно посылает всем используемым коннекторам запросы на закрытие соединения. // Процедура Закрыть() Экспорт РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); @@ -169,6 +170,14 @@ Возврат Коннектор; КонецФункции +// Получает ХранилищеСущностей, привязанное к переданному типу сущности. +// +// Параметры: +// ТипСущности - Тип - Тип сущности, зарегистрированный в Модели +// +// Возвращаемое значение: +// ХранилищеСущностей - Хранилище сущностей, привязанное к переданному типу сущности. +// Функция ПолучитьХранилищеСущностей(ТипСущности) Экспорт ОбъектМодели = МодельДанных.Получить(ТипСущности); ХранилищеСущностей = ХранилищаСущностей.Получить( @@ -178,6 +187,17 @@ Возврат ХранилищеСущностей; КонецФункции +// @internal +// Для служебного пользования. +// +// Возвращает пул сущностей из хранилища сущностей, привязанного к переданному типу сущности. +// +// Параметры: +// ТипСущности - Тип - Тип сущности, зарегистрированный в Модели. +// +// Возвращаемое значение: +// Соответствие - Пул сущностей. +// Функция ПолучитьПулСущностей(ТипСущности) Экспорт Возврат ПолучитьХранилищеСущностей(ТипСущности).ПолучитьПулСущностей(); КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index a6f3472..0d1d631 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -12,19 +12,58 @@ ПулСущностей = Новый Соответствие(); КонецПроцедуры +// Сохраняет сущность в БД. +// +// Параметры: +// Сущность - Произвольный - Объект (экземпляр класса, зарегистрированного в модели) для сохранения в БД. +// Процедура Сохранить(Сущность) Экспорт РаботаСКоннекторами.Сохранить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры + +// Осуществляет поиск сущностей типа, привязанного к ХранилищуСущностей, по идентификатору. +// +// Параметры: +// Отбор - Произвольный - Отбор для поиска. +// Если параметр не задан или равен "Неопределено", то возвращаются все найденные сущности указанного типа. +// Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска +// ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. +// Если параметр имеет тип "Массив", то каждое элемент массива должен иметь тип "ЭлементОтбора". +// Каждый элемент отбора преобразуется к условию поиска. В качестве "ПутьКДанным" указываются имена полей. +// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. +// В качестве "ПутьКДанным" указываются имена полей. +// +// Возвращаемое значение: +// Массив - Массив найденных сущностей. В качестве элементов массива выступают +// экземпляры класса с типом, привязанным к ХранилищуСущностей, с заполненными значениями полей. +// Функция Получить(Отбор = Неопределено) Экспорт Возврат РаботаСКоннекторами.Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции +// Осуществляет поиск сущности типа, привязанного к ХранилищуСущностей, по идентификатору. +// +// Параметры: +// Отбор - Произвольный - Отбор для поиска. +// Если параметр не задан или равен "Неопределено", то возвращаются все найденные сущности указанного типа. +// Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска. +// ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. +// Если параметр имеет тип "Массив", то каждое элемент массива должен иметь тип "ЭлементОтбора". +// Каждый элемент отбора преобразуется к условию поиска. В качестве "ПутьКДанным" указываются имена полей. +// Если параметр имеет тип "ЭлементОтбора", то элемент отбора преобразуется к условию поиска. +// В качестве "ПутьКДанным" указываются имена полей. +// Любой другой тип интерпретируется как поиск по &Идентификатору. +// +// Возвращаемое значение: +// Произвольный - Если сущность была найдена, то возвращается экземпляр класса с типом, +// привязанным к ХранилищуСущностей, с заполненными значениями полей. Иначе возвращается "Неопределено". +// Функция ПолучитьОдно(Знач Отбор = Неопределено) Экспорт Возврат РаботаСКоннекторами.ПолучитьОдно(Коннектор, ОбъектМодели, ПулСущностей, Отбор); КонецФункции -// Удаляет удаление сущности из базы данных. +// Выполняет удаление сущности из базы данных. // Сущность должна иметь заполненный идентификатор. // // Параметры: @@ -34,6 +73,14 @@ РаботаСКоннекторами.Удалить(Коннектор, ОбъектМодели, ПулСущностей, Сущность); КонецПроцедуры +// Выполняет очистку текущего Хранилища сущностей. +// Дополнительно посылает коннектору запрос на закрытие соединения. +// +Процедура Закрыть() Экспорт + РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); + ПулСущностей.Очистить(); +КонецПроцедуры + // Посылает коннектору запрос на начало транзакции. // Процедура НачатьТранзакцию() Экспорт @@ -62,12 +109,14 @@ Возврат Коннектор; КонецФункции -Процедура Закрыть() Экспорт - РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); - ПулСущностей.Очистить(); -КонецПроцедуры - // @internal +// Для служебного пользования. +// +// Возвращает пул сущностей текущего объекта. +// +// Возвращаемое значение: +// Соответствие - Пул сущностей. +// Функция ПолучитьПулСущностей() Экспорт Возврат ПулСущностей; КонецФункции From 0335fd68f8f1c6118e81986543d525e5b5d80527 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 12:43:38 +0700 Subject: [PATCH 20/25] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B0=D0=BC=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a9d2f3..680a995 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ // В метод можно передать отбор в виде соответствия, аналогично методу Получить() СохраненноеФизЛицо = МенеджерСущностей.ПолучитьОдно(Тип("ФизическоеЛицо"), Отбор); -// Если вызвать метод с параметром не-соответствием, то будет осуществлен поиск по идентификатору сущности. +// Если вызвать метод "ПолучитьОдно" с параметром не-соответствием, то будет осуществлен поиск по идентификатору сущности. Идентификатор = 123; СохраненноеФизЛицо = МенеджерСущностей.ПолучитьОдно(Тип("ФизическоеЛицо"), Идентификатор); ``` @@ -161,13 +161,29 @@ ## Удаление сущностей ```bsl - // Допустим имеется сущность, которую надо удалить. МенеджерСущностей.Удалить(СущностьФизическоеЛицо); // После выполнения метода в БД не останется строки с идентификатором, равным идентификатору сущности +``` + +## Работа через ХранилищеСущностей + +Для упрощения взаимодействия с библиотекой помимо МенеджераСущностей, подразумевающего постоянную передачу *типа сущности*, осуществлять операции над сущностями можно через ХранилищеСущностей. +Хранилище сущностей предоставляет тот же базовый интерфейс, что и МенеджерСущности, но не требует передачи типа сущности как параметра. +``` +// Получение хранилища сущностей +ХранилищеФизЛиц = МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ФизическоеЛицо")); + +// Поиск сущностей +Идентификатор = 1; +ФизЛицо = ХранилищеФизЛиц.ПолучитьОдно(Идентификатор); + +ФизЛицо.Имя = "Петр"; + +ХранилищеФизЛиц.Сохранить(ФизЛицо); ``` ## Система аннотаций для сущностей @@ -238,7 +254,13 @@ * Трансляция запросов от прикладной логики к коннекторам * Конструирование найденных сущностей по данным, возвращаемым коннекторами -### Коннекторы +### ХранилищеСущностей + +ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с глобальной привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`. + +В отличие от МенеджераСущностей, ХранилищеСущностей не требует передачи в методы параметра "ТипСущности". + +### Коннекторы (АбстрактныйКоннектор) Коннектор содержит в себе логику по работе с конкретной СУБД. Например, `КоннекторSQLite` служит для оперирования СУБД SQLite. В зоне ответственности коннектора находятся: @@ -255,6 +277,10 @@ Например, `КоннекторJSON` не умеет работать с транзакциями, однако, он имеет соответствующие методы, выводящие диагностические сообщения при их вызове. +> Важно! + +Каждое ХранилищеСущностей и МенеджерСущностей хранят в себе отдельные экземпляры Коннекторов. Тип, строка соединения и параметры коннектора определяются при создании МенеджераСущностей. + ### МодельДанных Модель данных хранит в себе список всех зарегистрированных классов-сущности в виде ОбъектовМодели From 73640f2732dd61a4d25f33bfdad6ac02abb8cac2 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 16:01:22 +0700 Subject: [PATCH 21/25] =?UTF-8?q?=D0=A5=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89?= =?UTF-8?q?=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B2=20=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D0=B7=D0=B5=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=B9,=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D1=81=D0=BE=D0=B5?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\276\321\201\321\202\320\265\320\271.os" | 37 +++++++++++++++---- ...20\276\321\201\321\202\320\265\320\271.os" | 2 +- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index c32518b..3b16907 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -5,10 +5,10 @@ Функция Получить(ОбъектМодели, Коннектор) Экспорт - // TODO: ХранилищаСущностей должны храниться и получаться в разрезе коннекторов и строк соединения Семафор.Захватить(); - ХранилищеСущностей = Хранилища.Получить(ОбъектМодели.ТипСущности()); + КлючХранилища = ПолучитьКлючХранилища(ОбъектМодели.ТипСущности(), ТипЗнч(Коннектор), Коннектор.ПолучитьСтрокуСоединения()); + ХранилищеСущностей = Хранилища.Получить(КлючХранилища); Если ХранилищеСущностей = Неопределено Тогда ХранилищеСущностей = Новый ХранилищеСущностей( ОбъектМодели, @@ -16,7 +16,7 @@ Коннектор.ПолучитьСтрокуСоединения(), Коннектор.ПолучитьПараметрыКоннектора() ); - Хранилища.Вставить(ОбъектМодели.ТипСущности(), ХранилищеСущностей); + Хранилища.Вставить(КлючХранилища, ХранилищеСущностей); КонецЕсли; Семафор.Освободить(); @@ -26,14 +26,35 @@ КонецФункции Процедура Закрыть(ТипКоннектора, СтрокаСоединения, ПараметрыКоннектора) Экспорт - // TODO: Сделать поиск, когда хранилища будут храниться в разрезе типов коннекторов и строк соединения - ЗакрываемыеХранилища = Хранилища; - Для Каждого КлючИЗначение Из ЗакрываемыеХранилища Цикл + + Семафор.Захватить(1000); + + ЗакрываемыеХранилища = Новый Массив; + Для Каждого КлючИЗначение Из Хранилища Цикл Хранилище = КлючИЗначение.Значение; - Хранилище.Закрыть(); + КоннекторХранилища = Хранилище.ПолучитьКоннектор(); + Если ТипКоннектора = ТипЗнч(КоннекторХранилища) И СтрокаСоединения = КоннекторХранилища.ПолучитьСтрокуСоединения() Тогда + Хранилище.Закрыть(); + ЗакрываемыеХранилища.Добавить(КлючИЗначение.Ключ); + КонецЕсли; КонецЦикла; - ЗакрываемыеХранилища.Очистить(); + + Для Каждого ЗакрываемоеХранилище Из ЗакрываемыеХранилища Цикл + Хранилища.Удалить(ЗакрываемоеХранилище); + КонецЦикла; + + Семафор.Освободить(); + КонецПроцедуры +Функция ПолучитьКлючХранилища(ТипСущности, ТипКоннектора, СтрокаСоединения) + Возврат СтрШаблон( + "%1 - %2 - %3", + ТипСущности, + ТипКоннектора, + СтрокаСоединения + ); +КонецФункции + Хранилища = Новый Соответствие(); Семафор = Новый Семафор(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index ae3fd81..f396c04 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -137,7 +137,7 @@ Процедура Закрыть() Экспорт РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); МодельДанных.Очистить(); - ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), СтрокаСоединенияКоннектора, ПараметрыКоннектора); + ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), Коннектор.ПолучитьСтрокуСоединения(), Коннектор.ПолучитьПараметрыКоннектора()); // Для освобожения ссылок на все коннекторы и соединения с СУБД ВыполнитьСборкуМусора(); КонецПроцедуры From 44c2a4e99fd7064115b70bca7e3fdbc4a3d45eb3 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 16:03:40 +0700 Subject: [PATCH 22/25] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20=D1=85=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=D1=89=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 680a995..2a19b18 100644 --- a/README.md +++ b/README.md @@ -256,10 +256,12 @@ ### ХранилищеСущностей -ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с глобальной привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`. +ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с глобальной привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`. В отличие от МенеджераСущностей, ХранилищеСущностей не требует передачи в методы параметра "ТипСущности". +Хранилища сущностей и пулы сущностей совпадают в рамках одного типа сущности, типа коннектора и строки соединения. Другими словами, два менеджера сущности, проинициализированные одним и тем же коннектором и строкой соединения, вернут одинаковые хранилища сущностей одного типа. + ### Коннекторы (АбстрактныйКоннектор) Коннектор содержит в себе логику по работе с конкретной СУБД. Например, `КоннекторSQLite` служит для оперирования СУБД SQLite. В зоне ответственности коннектора находятся: From c4315cf364d150093d0513e8d90a9cbe94a95150 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 4 Dec 2018 16:14:41 +0700 Subject: [PATCH 23/25] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20=D0=BA=20sqlite=20=D0=B8=20=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=83=20in-memory=20=D0=B1=D0=B0=D0=B7=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a19b18..427d2f2 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ Для упрощения взаимодействия с библиотекой помимо МенеджераСущностей, подразумевающего постоянную передачу *типа сущности*, осуществлять операции над сущностями можно через ХранилищеСущностей. Хранилище сущностей предоставляет тот же базовый интерфейс, что и МенеджерСущности, но не требует передачи типа сущности как параметра. -``` +```bsl // Получение хранилища сущностей ХранилищеФизЛиц = МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ФизическоеЛицо")); @@ -304,6 +304,16 @@ Помимо мета-информации ОбъектМодели позволяет получать значения колонок таблицы на основании имен полей сущности (и наоборот), вычислять значение идентификатора сущности, выполнять приведение типов и установку значений полей сущности. +### КоннекторSQLite + +В состав библиотеки входит референсная реализация интерфейса коннектора в виде коннектора к СУБД SQLite. Реализация базируется на библиотеке [sql](https://github.com/oscript-library/sql). + +Коннектор поддерживает все CRUD-операции над сущностями, простой и сложный поиск, работу с транзакциями. + +> Внимание! + +При использовании in-memory базы данных в моделях больше, чем с одним типом сущности, строка соединения должна выглядеть так: `"FullUri=file::memory:?cache=shared"` + ## Версионирование и обратная совместимость Библиотека `entity` в целом следует концепции [семантического версионирования](https://semver.org/) со следующими изменениями в правилах нумерации версий: From ebcd14c42920062dea63f42504b916e2a95d00d5 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 5 Dec 2018 12:26:15 +0700 Subject: [PATCH 24/25] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=BE=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 427d2f2..5de4a9b 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,22 @@ ХранилищеФизЛиц.Сохранить(ФизЛицо); ``` +### Работа с транзакциями + +Методы по работе с транзакциями есть как в Менеджере сущностей, так и в Хранилище сущностей. + +Транзакционность поддерживается в рамках экземпляра менеджера сущностей или хранилища сущностей. При необходимости работы с транзакциями с несколькими типами сущностей следует использовать методы работы с транзакциями в Менеджере сущностей и модифицировать сущности через него же. + +```bsl +МенеджерСущностей.НачатьТранзацию(); + +// Объекты ФизическоеЛицо и СтранаМира из примеров выше: +МенеджерСущностей.Сохранить(СтранаМира); +МенеджерСущностей.Сохранить(СохраняемоеФизЛицо); + +МенеджерСущностей.ЗафиксироватьТранзакцию(); +``` + ## Система аннотаций для сущностей Для связями между классом на OneScript и таблицей в БД используется система аннотаций. Часть аннотаций обязательная к применению. Все параметры аннотаций необязательные. From bedfd7e5c3857a551549d9fdb12608e7e57f8733 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 5 Dec 2018 12:38:01 +0700 Subject: [PATCH 25/25] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20breaking?= =?UTF-8?q?=20change=20=D0=BD=D0=B0=20API=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2.=20=D0=94=D0=BE=D0=BF=20?= =?UTF-8?q?=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2?= =?UTF-8?q?=20=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=A1=D0=9A=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\276\321\200\320\260\320\274\320\270.os" | 31 +++++++++++++++++++ ...20\276\321\201\321\202\320\265\320\271.os" | 18 ++++++----- ...20\265\320\272\321\202\320\276\321\200.os" | 12 ------- ...\320\272\321\202\320\276\321\200SQLite.os" | 13 -------- ...20\276\321\201\321\202\320\265\320\271.os" | 3 +- 5 files changed, 44 insertions(+), 33 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" index 3b28784..060dfe0 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" @@ -1,11 +1,20 @@ #Использовать asserts +Перем СвойстваКоннекторов; + Функция СоздатьКоннектор(ТипКоннектора) Экспорт Коннектор = Новый(ТипКоннектора); + СвойстваКоннектора = Конструктор_СвойстваКоннектора(); + СвойстваКоннекторов.Вставить(Коннектор, СвойстваКоннектора); + Возврат Коннектор; КонецФункции Процедура ОткрытьКоннектор(Коннектор, СтрокаСоединения, ПараметрыКоннектора) Экспорт + СвойстваКоннектора = СвойстваКоннекторов.Получить(Коннектор); + СвойстваКоннектора.СтрокаСоединения = СтрокаСоединения; + СвойстваКоннектора.Параметры = ПараметрыКоннектора; + Коннектор.Открыть(СтрокаСоединения, ПараметрыКоннектора); КонецПроцедуры @@ -164,6 +173,18 @@ Коннектор.ОтменитьТранзакцию(); КонецПроцедуры +// Возвращает дополнительные свойства коннектора +// +// Параметры: +// Коннектор - АбстрактныйКоннектор - Коннектор, свойства которого необходимо получить. +// +// Возвращаемое значение: +// Структура - Дополнительные свойства коннектора. см. Конструктор_СвойстваКоннектора() +// +Функция ПолучитьСвойстваКоннектора(Коннектор) Экспорт + Возврат СвойстваКоннекторов.Получить(Коннектор); +КонецФункции + // <Описание процедуры> // // Параметры: @@ -196,3 +217,13 @@ ).Заполнено(); КонецПроцедуры + +Функция Конструктор_СвойстваКоннектора() + СвойстваКоннектора = Новый Структура; + СвойстваКоннектора.Вставить("СтрокаСоединения"); + СвойстваКоннектора.Вставить("Параметры"); + + Возврат СвойстваКоннектора; +КонецФункции + +СвойстваКоннекторов = Новый Соответствие(); diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 3b16907..b056554 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -7,14 +7,16 @@ Семафор.Захватить(); - КлючХранилища = ПолучитьКлючХранилища(ОбъектМодели.ТипСущности(), ТипЗнч(Коннектор), Коннектор.ПолучитьСтрокуСоединения()); + СвойстваКоннектора = РаботаСКоннекторами.ПолучитьСвойстваКоннектора(Коннектор); + + КлючХранилища = ПолучитьКлючХранилища(ОбъектМодели.ТипСущности(), ТипЗнч(Коннектор), СвойстваКоннектора.СтрокаСоединения); ХранилищеСущностей = Хранилища.Получить(КлючХранилища); Если ХранилищеСущностей = Неопределено Тогда ХранилищеСущностей = Новый ХранилищеСущностей( - ОбъектМодели, - ТипЗнч(Коннектор), - Коннектор.ПолучитьСтрокуСоединения(), - Коннектор.ПолучитьПараметрыКоннектора() + ОбъектМодели, + ТипЗнч(Коннектор), + СвойстваКоннектора.СтрокаСоединения, + СвойстваКоннектора.Параметры ); Хранилища.Вставить(КлючХранилища, ХранилищеСущностей); КонецЕсли; @@ -33,12 +35,14 @@ Для Каждого КлючИЗначение Из Хранилища Цикл Хранилище = КлючИЗначение.Значение; КоннекторХранилища = Хранилище.ПолучитьКоннектор(); - Если ТипКоннектора = ТипЗнч(КоннекторХранилища) И СтрокаСоединения = КоннекторХранилища.ПолучитьСтрокуСоединения() Тогда + СвойстваКоннектора = РаботаСКоннекторами.ПолучитьСвойстваКоннектора(КоннекторХранилища); + + Если ТипКоннектора = ТипЗнч(КоннекторХранилища) И СтрокаСоединения = СвойстваКоннектора.СтрокаСоединения Тогда Хранилище.Закрыть(); ЗакрываемыеХранилища.Добавить(КлючИЗначение.Ключ); КонецЕсли; КонецЦикла; - + Для Каждого ЗакрываемоеХранилище Из ЗакрываемыеХранилища Цикл Хранилища.Удалить(ЗакрываемоеХранилище); КонецЦикла; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" index 94ae3ce..f180959 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200.os" @@ -1,7 +1,5 @@ // Для хранения статуса соединения Перем Открыт; -Перем мСтрокаСоединения; -Перем мПараметрыКоннектора; // Конструктор объекта АбстрактныйКоннектор. // @@ -9,14 +7,6 @@ Открыт = Ложь; КонецПроцедуры -Функция ПолучитьСтрокуСоединения() Экспорт - Возврат мСтрокаСоединения; -КонецФункции - -Функция ПолучитьПараметрыКоннектора() Экспорт - Возврат мПараметрыКоннектора; -КонецФункции - // Открыть соединение с БД. // // Параметры: @@ -24,8 +14,6 @@ // ПараметрыКоннектора - Массив - Дополнительные параметры инициализиации коннектора. // Процедура Открыть(СтрокаСоединения, ПараметрыКоннектора) Экспорт - мСтрокаСоединения = СтрокаСоединения; - мПараметрыКоннектора = ПараметрыКоннектора; Открыт = Истина; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" index c0b19d7..ef608c0 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" @@ -5,8 +5,6 @@ #Использовать strings Перем Соединение; -Перем мСтрокаСоединения; -Перем мПараметрыКоннектора; Перем Лог; @@ -17,14 +15,6 @@ Лог = Логирование.ПолучитьЛог("oscript.lib.entity.connector.sqlite"); КонецПроцедуры -Функция ПолучитьСтрокуСоединения() Экспорт - Возврат мСтрокаСоединения; -КонецФункции - -Функция ПолучитьПараметрыКоннектора() Экспорт - Возврат мПараметрыКоннектора; -КонецФункции - // Открыть соединение с БД. // // Параметры: @@ -32,9 +22,6 @@ // ПараметрыКоннектора - Массив - Дополнительные параметры инициализиации коннектора. // Процедура Открыть(СтрокаСоединения, ПараметрыКоннектора) Экспорт - мСтрокаСоединения = СтрокаСоединения; - мПараметрыКоннектора = ПараметрыКоннектора; - Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; Соединение.СтрокаСоединения = СтрокаСоединения; Соединение.Открыть(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index f396c04..04a714c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -137,7 +137,8 @@ Процедура Закрыть() Экспорт РаботаСКоннекторами.ЗакрытьКоннектор(Коннектор); МодельДанных.Очистить(); - ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), Коннектор.ПолучитьСтрокуСоединения(), Коннектор.ПолучитьПараметрыКоннектора()); + СвойстваКоннектора = РаботаСКоннекторами.ПолучитьСвойстваКоннектора(Коннектор); + ХранилищаСущностей.Закрыть(ТипЗнч(Коннектор), СвойстваКоннектора.СтрокаСоединения, СвойстваКоннектора.Параметры); // Для освобожения ссылок на все коннекторы и соединения с СУБД ВыполнитьСборкуМусора(); КонецПроцедуры