Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#### Параметр
```bsl
// Получает и возвращает значение из индекса параметров
// Индекс строится один раз в Прочитать(), чтение потокобезопасно и выполняется без блокировок
//
// Параметры:
// ИмяПараметра - Строка - имя параметра
Expand All @@ -85,6 +86,8 @@
#### ПрочитанныеПараметры
```bsl
// Возвращает соответствие прочитанных параметров (сырой результат без обработки конструктором)
// Изменения возвращенного соответствия не попадают в Параметр(): индекс параметров
// строится в Прочитать(), для применения изменений нужно повторно вызвать Прочитать()
//
// Возвращаемое значение:
// Соответствие - прочитанные параметры
Expand All @@ -95,6 +98,9 @@
#### Прочитать
```bsl
// Выполняет чтения параметров из доступных провайдеров
// Новый индекс параметров строится полностью и только потом подменяет прежний,
// поэтому Параметр() можно вызывать параллельно с Прочитать(): до подмены читается прежний индекс.
// Параллельные вызовы Прочитать() между собой не поддерживаются
//
```

Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
//

Описание.Имя("configor")
.Версия("0.12.0")
.Версия("0.12.1")
.Автор("Khorev Aleksey")
.АдресАвтора("Khorevaa@gmail.com")
.Описание("Библиотека для работы с конфигурационными файлами в формате json, yaml")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,68 +2,80 @@
#Использовать logos

Перем Лог;
Перем ИндексКоллекция; // Соответствие
Перем ИндексСформирован; // Булево
Перем КоллекцияИндекса; // Произвольный
Перем ИндексКоллекция; // Соответствие - опубликованный индекс, Неопределено - коллекция не установлена.
// Строится целиком в локальную карту и публикуется одним присваиванием,
// после публикации не изменяется: читается без блокировок из любых потоков

Функция Коллекция(Знач ВходящаяКоллекция) Экспорт

КоллекцияИндекса = ВходящаяКоллекция;
ИндексСформирован = Ложь;
НовыйИндекс = ПостроитьИндекс(ВходящаяКоллекция);

// Читатели видят либо прежний индекс, либо новый целиком
ИндексКоллекция = НовыйИндекс;

Возврат ЭтотОбъект;

КонецФункции

Процедура Очистить() Экспорт

КоллекцияИндекса = Неопределено;
ИндексСформирован = Ложь;
ИндексКоллекция = Неопределено;

КонецПроцедуры

// Возвращает опубликованный индекс. Индекс общий для всех потоков, изменять его нельзя
//
// Возвращаемое значение:
// Соответствие - плоский индекс значений коллекции
//
Функция ПолучитьИндекс() Экспорт

ПроверитьИндекс();

Возврат ИндексКоллекция;
Возврат ОпубликованныйИндекс();

КонецФункции

Функция Значение(Знач КлючИндекса) Экспорт

ПроверитьИндекс();
Индекс = ОпубликованныйИндекс();

Если ТипЗнч(КлючИндекса) = Тип("Строка") Тогда
КлючИндекса = НРег(КлючИндекса);
КонецЕсли;

ЗначениеИзИндекса = ИндексКоллекция[КлючИндекса];
ЗначениеИзИндекса = Индекс[КлючИндекса];

Возврат ЗначениеИзИндекса;

КонецФункции

Процедура СформироватьИндекс()
Функция ПостроитьИндекс(Знач ИсходнаяКоллекция)

ИндексКоллекция = Новый Соответствие;
Индекс = Новый Соответствие;

// Рекурсивный вызов для входящих параметров
ДобавитьЗначениеПараметра("", КоллекцияИндекса);
ДобавитьЗначениеПараметра(Индекс, "", ИсходнаяКоллекция);

КонецПроцедуры
Возврат Индекс;

Процедура ПроверитьИндекс()
КонецФункции

Если КоллекцияИндекса = Неопределено Тогда
ВызватьИсключение Новый ИнформацияОбОшибке("Коллекция индекса не установлена");
КонецЕсли;
// Поле читается один раз, дальше работа идет с локальной ссылкой,
// которую не подменят параллельные Коллекция() и Очистить()
//
// Возвращаемое значение:
// Соответствие - опубликованный индекс
//
Функция ОпубликованныйИндекс()

Если НЕ ИндексСформирован Тогда
СформироватьИндекс();
Индекс = ИндексКоллекция;

Если Индекс = Неопределено Тогда
ВызватьИсключение "Коллекция индекса не установлена";
КонецЕсли;

Возврат Индекс;

КонецПроцедуры
КонецФункции

Функция ЭтоМассив(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Массив");
Expand All @@ -81,7 +93,7 @@
Возврат ТипЗнч(Значение) = Тип("Сценарий");
КонецФункции

Процедура ДобавитьПараметрВИндекс(Знач ИмяПараметра, Знач ЗначениеПараметра)
Процедура ДобавитьПараметрВИндекс(Индекс, Знач ИмяПараметра, Знач ЗначениеПараметра)

// Вставляем все значение целиком
Если Не ПустаяСтрока(ИмяПараметра) Тогда
Expand All @@ -91,27 +103,25 @@
ИмяПараметра = НРег(ИмяПараметра);
КонецЕсли;

ИндексКоллекция.Вставить(ИмяПараметра, ЗначениеПараметра);
Индекс.Вставить(ИмяПараметра, ЗначениеПараметра);
КонецЕсли;

// Рекурсивное заполнение значения параметра
ДобавитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра);
ДобавитьЗначениеПараметра(Индекс, ИмяПараметра, ЗначениеПараметра);

КонецПроцедуры

Процедура ДобавитьЗначениеПараметра(Знач ИмяПараметра, Знач ЗначениеПараметра)
Процедура ДобавитьЗначениеПараметра(Индекс, Знач ИмяПараметра, Знач ЗначениеПараметра)

Если ЭтоМассив(ЗначениеПараметра) Тогда
ДобавитьПараметрМассивВИндекс(ЗначениеПараметра, ИмяПараметра);
ИначеЕсли ЭтоСоответствие(ЗначениеПараметра) Тогда
ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
ИначеЕсли ЭтоСтруктура(ЗначениеПараметра) Тогда
ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
ДобавитьПараметрМассивВИндекс(Индекс, ЗначениеПараметра, ИмяПараметра);
ИначеЕсли ЭтоСоответствие(ЗначениеПараметра) Или ЭтоСтруктура(ЗначениеПараметра) Тогда
ДобавитьСоответствиеВИндекс(Индекс, ЗначениеПараметра, ИмяПараметра);
КонецЕсли;

КонецПроцедуры

Процедура ДобавитьПараметрМассивВИндекс(Знач МассивЗначений, Знач ИмяРодителя = "")
Процедура ДобавитьПараметрМассивВИндекс(Индекс, Знач МассивЗначений, Знач ИмяРодителя = "")

Лог.Отладка("Обрабатываю массив значений <%1> ", ИмяРодителя);

Expand All @@ -124,13 +134,13 @@
Для ИндексЗначения = 0 По МассивЗначений.ВГраница() Цикл

ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИндексЗначения);
ДобавитьПараметрВИндекс(ИмяПараметра, МассивЗначений[ИндексЗначения]);
ДобавитьПараметрВИндекс(Индекс, ИмяПараметра, МассивЗначений[ИндексЗначения]);

КонецЦикла;

КонецПроцедуры

Процедура ДобавитьСоответствиеВИндекс(Знач ВходящиеПараметры, Знач ИмяРодителя = "")
Процедура ДобавитьСоответствиеВИндекс(Индекс, Знач ВходящиеПараметры, Знач ИмяРодителя = "")

Лог.Отладка("Обрабатываю соответствие значений <%1> ", ИмяРодителя);

Expand All @@ -147,7 +157,7 @@
ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, КлючЗначение.Ключ);
ЗначениеПараметра = КлючЗначение.Значение;

ДобавитьПараметрВИндекс(ИмяПараметра, ЗначениеПараметра);
ДобавитьПараметрВИндекс(Индекс, ИмяПараметра, ЗначениеПараметра);

КонецЦикла;

Expand Down
7 changes: 6 additions & 1 deletion src/Классы/МенеджерПараметров.os
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#Область Экспортных_процедур

// Получает и возвращает значение из индекса параметров
// Индекс строится один раз в Прочитать(), чтение потокобезопасно и выполняется без блокировок
//
// Параметры:
// ИмяПараметра - Строка - имя параметра
Expand Down Expand Up @@ -55,6 +56,8 @@
КонецФункции

// Возвращает соответствие прочитанных параметров
// Изменения возвращенного соответствия не попадают в Параметр(): индекс параметров
// строится в Прочитать(), для применения изменений нужно повторно вызвать Прочитать()
//
// Возвращаемое значение:
// Соответствие - прочитанные параметров
Expand All @@ -64,10 +67,12 @@
КонецФункции

// Выполняет чтения параметров из доступных провайдеров
// Новый индекс параметров строится полностью и только потом подменяет прежний,
// поэтому Параметр() можно вызывать параллельно с Прочитать(): до подмены читается прежний индекс.
// Параллельные вызовы Прочитать() между собой не поддерживаются
//
Процедура Прочитать() Экспорт

ИндексПараметров.Очистить();
ПрочитанныеПараметры.Очистить();
ВыполнитьЧтениеПровайдеров();

Expand Down
Loading
Loading