diff --git a/src/addins/sqlite/Cargo.toml b/src/addins/sqlite/Cargo.toml index 0c69ae169a..d3d37b1c3d 100644 --- a/src/addins/sqlite/Cargo.toml +++ b/src/addins/sqlite/Cargo.toml @@ -7,10 +7,11 @@ edition = "2021" crate-type = ["cdylib"] [profile.release] -lto = true # Enable Link Time Optimization +lto = "fat" # Enable Link Time Optimization codegen-units = 1 # Reduce number of codegen units to increase optimizations. panic = "abort" # Abort on panic strip = true # Automatically strip symbols from the binary. +opt-level = "z" [dependencies] addin1c = "0.5.0" diff --git a/src/addins/sqlite/src/component/methods.rs b/src/addins/sqlite/src/component/methods.rs index 4379ec0fc8..42eba9c5f6 100644 --- a/src/addins/sqlite/src/component/methods.rs +++ b/src/addins/sqlite/src/component/methods.rs @@ -113,7 +113,7 @@ fn rows_to_json_array(rows: &mut rusqlite::Rows, cols: &Vec) -> String { } } - json!({ "result": json_array }).to_string() + json!({ "result": true, "data": json_array }).to_string() } fn from_sql_to_json(value: ValueRef) -> Value { diff --git a/src/addins/sqlite/src/component/mod.rs b/src/addins/sqlite/src/component/mod.rs index 39194d7459..026e723302 100644 --- a/src/addins/sqlite/src/component/mod.rs +++ b/src/addins/sqlite/src/component/mod.rs @@ -20,7 +20,7 @@ pub fn get_params_amount(num: usize) -> usize { match num { 0 => 0, 1 => 0, - 2 => 2, + 2 => 3, _ => 0, } } diff --git a/src/en/OInt/addins/OPI_SQLite.zip b/src/en/OInt/addins/OPI_SQLite.zip index 6d6869c508..592bcfc677 100644 Binary files a/src/en/OInt/addins/OPI_SQLite.zip and b/src/en/OInt/addins/OPI_SQLite.zip differ diff --git a/src/en/OInt/addins/OPI_TCPServer.zip b/src/en/OInt/addins/OPI_TCPServer.zip deleted file mode 100644 index 80a2916c5d..0000000000 Binary files a/src/en/OInt/addins/OPI_TCPServer.zip and /dev/null differ diff --git a/src/en/OPI/src/CommonTemplates/OPI_SQLite/Template.addin b/src/en/OPI/src/CommonTemplates/OPI_SQLite/Template.addin index 6d6869c508..592bcfc677 100644 Binary files a/src/en/OPI/src/CommonTemplates/OPI_SQLite/Template.addin and b/src/en/OPI/src/CommonTemplates/OPI_SQLite/Template.addin differ diff --git a/src/ru/OInt/addins/OPI_SQLite.zip b/src/ru/OInt/addins/OPI_SQLite.zip index 6d6869c508..592bcfc677 100644 Binary files a/src/ru/OInt/addins/OPI_SQLite.zip and b/src/ru/OInt/addins/OPI_SQLite.zip differ diff --git a/src/ru/OInt/addins/OPI_TCPServer.zip b/src/ru/OInt/addins/OPI_TCPServer.zip deleted file mode 100644 index 80a2916c5d..0000000000 Binary files a/src/ru/OInt/addins/OPI_TCPServer.zip and /dev/null differ diff --git a/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl index 4988584273..7b2ab4561d 100644 --- a/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl @@ -1,4 +1,4 @@ -// OneScript: ./OInt/core/Modules/OPI_SQLite.os +// OneScript: ./OInt/core/Modules/OPI_SQLite.os // Lib: SQLite // CLI: sqlite @@ -45,7 +45,7 @@ #Область ОсновныеМетоды -// Создать подключение !NOCLI +// Создать соединение !NOCLI // Создает подключение к указанной базе // // Параметры: @@ -53,7 +53,7 @@ // // Возвращаемое значение: // Произвольный - Объект коннектора или структура с информацией об ошибке -Функция СоздатьПодключение(Знач База = "") Экспорт +Функция ОткрытьСоединение(Знач База = "") Экспорт Если ЭтоКоннектор(База) Тогда Возврат База; @@ -72,7 +72,7 @@ КонецФункции -// Закрыть подключение !NOCLI +// Закрыть соединение !NOCLI // Явно закрывает переданное соединение // // Параметры: @@ -80,7 +80,7 @@ // // Возвращаемое значение: // Структура Из КлючИЗначение - Результат закрытия соединения -Функция ЗакрытьПодключение(Знач Соединение) Экспорт +Функция ЗакрытьСоединение(Знач Соединение) Экспорт Если ЭтоКоннектор(Соединение) Тогда @@ -119,14 +119,15 @@ , Знач Соединение = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстЗапроса); + OPI_ПреобразованиеТипов.ПолучитьБулево(ФорсироватьРезультат); Параметры_ = ОбработатьПараметры(Параметры); - Коннектор = СоздатьПодключение(Соединение); + Коннектор = ОткрытьСоединение(Соединение); Если ТипЗнч(Коннектор) <> Тип("AddIn.OPI_SQLite.Main") Тогда Возврат Коннектор; КонецЕсли; - + Результат = Коннектор.Execute(ТекстЗапроса, Параметры_, ФорсироватьРезультат); Результат = OPI_Инструменты.JsonВСтруктуру(Результат, Ложь); diff --git a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl index 4694ec02b3..1bf521c499 100644 --- a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -1,4 +1,4 @@ -// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os +// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os // MIT License @@ -2218,7 +2218,9 @@ ПараметрыТеста = Новый Структура; - SQLite_СоздатьПодключение(ПараметрыТеста); + SQLite_ОткрытьСоединение(ПараметрыТеста); + SQLite_ЗакрытьСоединение(ПараметрыТеста); + SQLite_ВыполнитьЗапросSQL(ПараметрыТеста); КонецПроцедуры @@ -16065,12 +16067,12 @@ #Область SQLite -Процедура SQLite_СоздатьПодключение(ПараметрыФункции) +Процедура SQLite_ОткрытьСоединение(ПараметрыФункции) ИВФ = ПолучитьИмяВременногоФайла("sqlite"); - БазаНаДиске = OPI_SQLite.СоздатьПодключение(ИВФ); - БазаВПамяти = OPI_SQLite.СоздатьПодключение(); + БазаНаДиске = OPI_SQLite.ОткрытьСоединение(ИВФ); + БазаВПамяти = OPI_SQLite.ОткрытьСоединение(); // END @@ -16080,7 +16082,7 @@ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(БазаВПамяти, "СоздатьПодключение (im)", "SQLite"); OPI_ПолучениеДанныхТестов.Проверка_Компонента(БазаВПамяти, "AddIn.OPI_SQLite.Main"); - Закрытие = OPI_SQLite.ЗакрытьПодключение(БазаНаДиске); + Закрытие = OPI_SQLite.ЗакрытьСоединение(БазаНаДиске); OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Закрытие, "ЗакрытьПодключение", "SQLite"); OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Закрытие); @@ -16093,6 +16095,120 @@ КонецПроцедуры +Процедура SQLite_ЗакрытьСоединение(ПараметрыФункции) + + ИВФ = ПолучитьИмяВременногоФайла("sqlite"); + + Соединение = OPI_SQLite.ОткрытьСоединение(ИВФ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Соединение, "ОткрытьСоединение (закрытие)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_Компонента(Соединение, "AddIn.OPI_SQLite.Main"); // SKIP + + Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Закрытие, "ЗакрытьПодключение", "SQLite"); + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Закрытие); + + Попытка + УдалитьФайлы(ИВФ); + Исключение + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла базы", "SQLite"); + КонецПопытки + +КонецПроцедуры + +Процедура SQLite_ВыполнитьЗапросSQL(ПараметрыФункции) + + ИВФ = ПолучитьИмяВременногоФайла("sqlite"); + + Соединение = OPI_SQLite.ОткрытьСоединение(ИВФ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Соединение, "ОткрытьСоединение (запрос)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_Компонента(Соединение, "AddIn.OPI_SQLite.Main"); // SKIP + + // CREATE + + ТекстЗапроса = " + |CREATE TABLE test_table ( + |id INTEGER PRIMARY KEY, -- Автоинкрементируемый целочисленный идентификатор + |name TEXT, -- Текстовое поле + |age INTEGER, -- Целое число + |salary REAL, -- Число с плавающей точкой + |is_active BOOLEAN, -- Логическое значение + |created_at DATETIME, -- Дата/время в формате ISO 8601 + |data BLOB + |);"; + + Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапрос (Create)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP + + // INSERT с параметрами + + ТекстЗапроса = " + |-- Вставляем данные с использованием позиционных параметров + |INSERT INTO test_table (name, age, salary, is_active, created_at, data) + |VALUES (?1, ?2, ?3, ?4, ?5, ?6);"; + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить("Vitaly"); // TEXT + МассивПараметров.Добавить(25); // INTEGER + МассивПараметров.Добавить(1000.12); // REAL + МассивПараметров.Добавить(Истина); // BOOL + МассивПараметров.Добавить(OPI_Инструменты.ПолучитьТекущуюДату()); // DATETIME + МассивПараметров.Добавить(ПолучитьДвоичныеДанныеИзСтроки("Hello world")); // BLOB + + Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, МассивПараметров, , Соединение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапрос (Insert)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP + + // SELECT (Результат этого запроса приведен в следующем блоке) + + ТекстЗапроса = "SELECT id, name, age, salary, is_active, created_at, data FROM test_table;"; + + Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапрос (Select)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP + + // Транзакция + + ТекстЗапроса = "BEGIN TRANSACTION; + | CREATE TABLE IF NOT EXISTS users ( + | id INTEGER PRIMARY KEY AUTOINCREMENT, + | name TEXT NOT NULL, + | age INTEGER NOT NULL + | ); + | INSERT INTO users (name, age) VALUES ('Alice', 30); + | INSERT INTO users (name, age) VALUES ('Bob', 25); + | INSERT INTO users (name, age) VALUES ('Charlie', 35); + | COMMIT;"; + + + Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапрос (Transaction)", "SQLite"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP + + Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьПодключение (запрос)", "SQLite"); + OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); + + Попытка + УдалитьФайлы(ИВФ); + Исключение + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла базы", "SQLite"); + КонецПопытки + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/src/ru/OPI/src/CommonTemplates/OPI_SQLite/Template.addin b/src/ru/OPI/src/CommonTemplates/OPI_SQLite/Template.addin index 6d6869c508..592bcfc677 100644 Binary files a/src/ru/OPI/src/CommonTemplates/OPI_SQLite/Template.addin and b/src/ru/OPI/src/CommonTemplates/OPI_SQLite/Template.addin differ