From eac3f6384978fd7de6a5ffa29359368294ac4954 Mon Sep 17 00:00:00 2001 From: Anton Titovets Date: Wed, 12 Feb 2025 15:41:36 +0300 Subject: [PATCH] =?UTF-8?q?PG:=20=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonModules/OPI_PostgreSQL/Module.bsl | 159 ++++++------------ .../src/CommonModules/OPI_Тесты/Module.bsl | 9 +- 2 files changed, 61 insertions(+), 107 deletions(-) diff --git a/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl index f6efa6c603..83765bd006 100644 --- a/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl @@ -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"]; diff --git a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl index 1d33a9d7a9..56140409fc 100644 --- a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -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