1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-10 22:41:43 +02:00

PG: Валидация параметров

This commit is contained in:
Anton Titovets
2025-02-12 15:41:36 +03:00
parent 615eb3884a
commit eac3f63849
2 changed files with 61 additions and 107 deletions

View File

@@ -245,44 +245,6 @@
КонецФункции
// Получить типы колонок таблицы
// Получает массив типов колонок таблицы
//
// Параметры:
// Таблица - Строка - Имя таблицы - table
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
//
// Возвращаемое значение:
// Массив, Соответствие Из КлючИЗначение - Массив типов или информация об ошибке
Функция ПолучитьТипыКолонокТаблицы(Знач Таблица, Знач Соединение = "") Экспорт
ИнформацияОТаблице = ПолучитьИнформациюОТаблице(Таблица, Соединение);
Если Не ИнформацияОТаблице["result"] Тогда
Возврат ИнформацияОТаблице;
КонецЕсли;
МассивТипов = Новый Массив;
Для Каждого Колонка Из ИнформацияОТаблице Цикл
ТекущийТип = Колонка["data_type"];
ТекущийТип = Строка(вРег(ТекущийТип));
ТекущийТип = СтрЗаменить(ТекущийТип, " " , "_");
ТекущийТип = СтрЗаменить(ТекущийТип, """CHAR""", "OLDCHAR");
Если СтрНачинаетсяС(ТекущийТип, "CHAR") Тогда
ТекущийТип = "CHAR";
КонецЕсли;
МассивТипов.Добавить(ТекущийТип);
КонецЦикла;
Возврат МассивТипов;
КонецФункции
// Создать таблицу
// Создает пустую таблицу в базе
//
@@ -416,49 +378,6 @@
КонецФункции
// Нормализовать набор параметров
// Преобразует массив значений параметров в массив структур описаний для передачи в запрос
//
// Параметры:
// МассивЗначений - Массив Из Произвольный - Массив значений параметров запроса - values
// МассивТипов - Массив Из Строка - Массив типов колонок. См. ПолучитьТипыКолонокТаблицы - types
//
// Возвращаемое значение:
// Массив Из Соответствие - Нормализованный набор параметров для запроса
Функция НормализоватьНаборПараметров(Знач МассивЗначений, Знач МассивТипов) Экспорт
OPI_ПреобразованиеТипов.ПолучитьМассив(МассивЗначений);
OPI_ПреобразованиеТипов.ПолучитьМассив(МассивТипов);
СоответствиеТипов = ПолучитьСоответствиеТипов();
ИтоговыйМассив = Новый Массив;
ГраницаТипов = МассивТипов.ВГраница();
Для Н = 0 По МассивЗначений.ВГраница() Цикл
Если Н > ГраницаТипов Тогда
Прервать;
Конецесли;
ТекущийТип = вРег(МассивТипов[Н]);
ТекущееЗначение = МассивЗначений[Н];
ОписаниеТипа = СоответствиеТипов.Получить(ТекущийТип);
Если ОписаниеТипа <> Неопределено Тогда
ТекущееЗначение = ОписаниеТипа.ПривестиЗначение(ТекущееЗначение);
КонецЕсли;
ТекущееОписание = Новый Соответствие;
ТекущееОписание.Вставить(ТекущийТип, ТекущееЗначение);
ИтоговыйМассив.Добавить(ТекущееОписание);
КонецЦикла;
Возврат ИтоговыйМассив;
КонецФункции
// Получить структуру фильтра записей
// Получает структуру шаблон для фильтрации записей в запросах ORM
//
@@ -530,40 +449,72 @@
ТекущийПараметр = Параметры[Н];
Если ТипЗнч(ТекущийПараметр) = Тип("ДвоичныеДанные") Тогда
ТекущийПараметр = Новый Структура("BYTEA", Base64Строка(ТекущийПараметр));
ИначеЕсли OPI_Инструменты.ПолеКоллекцииСуществует(ТекущийПараметр, "BYTEA") Тогда
ТекущийПараметр = ОбработатьСтруктуруBlob(ТекущийПараметр);
ИначеЕсли ТипЗнч(ТекущийПараметр) = Тип("Дата") Тогда
ТекущийПараметр = XMLСтрока(ТекущийПараметр);
ИначеЕсли ТипЗнч(ТекущийПараметр) = Тип("Структура") Или ТипЗнч(ТекущийПараметр) = Тип("Соответствие") Тогда
Продолжить;
Иначе
Если Не OPI_Инструменты.ЭтоПримитивныйТип(ТекущийПараметр) Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущийПараметр);
КонецЕсли;
КонецЕсли;
ТекущийПараметр = ОбработатьПараметр(ТекущийПараметр);
Параметры[Н] = ТекущийПараметр;
КонецЦикла;
Параметры_ = OPI_Инструменты.JSONСтрокой(Параметры, , Ложь);
Если СтрНачинаетсяС(Параметры_, "НЕ JSON") Тогда
ВызватьИсключение "Ошибка валидации JSON массив параметров!";
КонецЕсли;
Возврат Параметры_;
КонецФункции
Функция ОбработатьПараметр(ТекущийПараметр, Вложенный = Ложь)
ТекущийТип = ТипЗнч(ТекущийПараметр);
Если ТекущийТип = Тип("ДвоичныеДанные") Тогда
ТекущийПараметр = Новый Структура("BYTEA", Base64Строка(ТекущийПараметр));
ИначеЕсли ТекущийТип = Тип("УникальныйИдентификатор") Тогда
ТекущийПараметр = Строка(ТекущийПараметр);
ИначеЕсли ТекущийТип = Тип("Дата") Тогда
ТекущийПараметр = XMLСтрока(ТекущийПараметр);
ИначеЕсли OPI_Инструменты.ПолеКоллекцииСуществует(ТекущийПараметр, "BYTEA") Тогда
ТекущийПараметр = ОбработатьСтруктуруBlob(ТекущийПараметр);
ИначеЕсли ТекущийТип = Тип("Структура")
Или ТекущийТип = Тип("Соответствие") Тогда
Для Каждого ЭлементПараметра Из ТекущийПараметр Цикл
ТекущийКлюч = вРег(ЭлементПараметра.Ключ);
ТекущееЗначение = ЭлементПараметра.Значение;
Если ТекущийКлюч = "JSONB"
Или ТекущийКлюч = "JSON"
Или ТекущийКлюч = "HSTORE" Тогда
Продолжить;
КонецЕсли;
ТекущийПараметр[ЭлементПараметра.Ключ] = ОбработатьПараметр(ТекущееЗначение, Истина);
КонецЦикла;
Иначе
Если Не OPI_Инструменты.ЭтоПримитивныйТип(ТекущийПараметр) Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущийПараметр);
КонецЕсли;
КонецЕсли;
Возврат ТекущийПараметр;
КонецФункции
Функция ОбработатьСтруктуруBlob(Знач Значение)
ЗначениеДанных = Значение["BYTEA"];

View File

@@ -17414,14 +17414,15 @@
СтрокаПодключения = OPI_PostgreSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль);
Таблица = "testtable";
Таблица = "testtable";
МассивЗаписей = Новый Массив;
Картинка = ПараметрыФункции["Picture"];
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // Картинка - Тип: ДвоичныеДанные
СлучайнаяСтруктура = Новый Структура("key,value", "ItsKey", 10);
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
СтруктураЗаписи = Новый Структура;
СтруктураЗаписи.Вставить("bool_field" , Новый Структура("BOOL" , Истина));
СтруктураЗаписи.Вставить("oldchar_field" , Новый Структура("OLDCHAR" , 1)); // или "char"
@@ -17448,7 +17449,9 @@
СтруктураЗаписи.Вставить("time_field" , Новый Структура("TIME" , ТекущаяДата));
СтруктураЗаписи.Вставить("uuid_field" , Новый Структура("UUID" , Новый УникальныйИдентификатор()));
Результат = OPI_PostgreSQL.ДобавитьЗаписи(Таблица, СтруктураЗаписи, Ложь, СтрокаПодключения);
МассивЗаписей.Добавить(СтруктураЗаписи);
Результат = OPI_PostgreSQL.ДобавитьЗаписи(Таблица, МассивЗаписей, Истина, СтрокаПодключения);
// END