├── .gitignore ├── fixtures ├── mysql-con-str.txt ├── pgsql-con-str.txt └── ms-sql-server-con-str.txt ├── oslib ├── Components │ └── net4 │ │ ├── Npgsql.dll │ │ ├── MySql.Data.dll │ │ ├── 1script_sql.dll │ │ ├── EntityFramework.dll │ │ ├── System.Data.SQLite.dll │ │ ├── System.ValueTuple.dll │ │ ├── x64 │ │ └── SQLite.Interop.dll │ │ ├── x86 │ │ └── SQLite.Interop.dll │ │ ├── System.Data.SQLite.EF6.dll │ │ ├── System.Data.SQLite.Linq.dll │ │ ├── EntityFramework.SqlServer.dll │ │ ├── System.Threading.Tasks.Extensions.dll │ │ ├── System.Runtime.CompilerServices.Unsafe.dll │ │ └── 1script_sql.dll.config ├── packagedef └── package-loader.os ├── global.json ├── docs ├── ТипСУБД.md ├── РезультатЗапроса.md ├── Запрос.md └── Соединение.md ├── oscript-sql ├── IOScriptQuery.cs ├── oscript-sql.csproj ├── EnumDBType.cs ├── QueryResult.cs ├── SQLQuery.cs └── DBConnector.cs ├── changelog.txt ├── TestApp ├── TestApp.csproj └── Program.cs ├── drafts └── insert-select-ms-sql-server.os ├── testcomponent.os ├── LICENSE ├── examples └── sqlite-in-memory.os ├── oscript-sql.sln ├── README.md ├── .github └── workflows │ └── ospx.yml ├── appveyor.yml ├── tests ├── test-mysql.os ├── test-pgsql.os ├── test-ms-sql-server.os ├── test-reader.os └── test-sqlite.os └── .vscode └── tasks.json /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | obj 3 | /packages 4 | /.vs 5 | *.sqlite 6 | .idea/ 7 | -------------------------------------------------------------------------------- /fixtures/mysql-con-str.txt: -------------------------------------------------------------------------------- 1 | server=localhost;user=root;database=test;port=3306 -------------------------------------------------------------------------------- /fixtures/pgsql-con-str.txt: -------------------------------------------------------------------------------- 1 | Host=localhost;Username=testuser;Password=testuser;Database=test;Port=5432 -------------------------------------------------------------------------------- /oslib/Components/net4/Npgsql.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/Npgsql.dll -------------------------------------------------------------------------------- /oslib/Components/net4/MySql.Data.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/MySql.Data.dll -------------------------------------------------------------------------------- /oslib/Components/net4/1script_sql.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/1script_sql.dll -------------------------------------------------------------------------------- /oslib/Components/net4/EntityFramework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/EntityFramework.dll -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "6.0.0", 4 | "rollForward": "latestMajor", 5 | "allowPrerelease": true 6 | } 7 | } -------------------------------------------------------------------------------- /oslib/Components/net4/System.Data.SQLite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.Data.SQLite.dll -------------------------------------------------------------------------------- /oslib/Components/net4/System.ValueTuple.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.ValueTuple.dll -------------------------------------------------------------------------------- /oslib/Components/net4/x64/SQLite.Interop.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/x64/SQLite.Interop.dll -------------------------------------------------------------------------------- /oslib/Components/net4/x86/SQLite.Interop.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/x86/SQLite.Interop.dll -------------------------------------------------------------------------------- /fixtures/ms-sql-server-con-str.txt: -------------------------------------------------------------------------------- 1 | Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog="test";Data Source=VAIO\SQLEXPRESS -------------------------------------------------------------------------------- /oslib/Components/net4/System.Data.SQLite.EF6.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.Data.SQLite.EF6.dll -------------------------------------------------------------------------------- /oslib/Components/net4/System.Data.SQLite.Linq.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.Data.SQLite.Linq.dll -------------------------------------------------------------------------------- /oslib/Components/net4/EntityFramework.SqlServer.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/EntityFramework.SqlServer.dll -------------------------------------------------------------------------------- /oslib/Components/net4/System.Threading.Tasks.Extensions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.Threading.Tasks.Extensions.dll -------------------------------------------------------------------------------- /oslib/Components/net4/System.Runtime.CompilerServices.Unsafe.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/sql/HEAD/oslib/Components/net4/System.Runtime.CompilerServices.Unsafe.dll -------------------------------------------------------------------------------- /docs/ТипСУБД.md: -------------------------------------------------------------------------------- 1 | # ТипСУБД / DBType 2 | 3 | Тип поддерживаемой СУБД 4 | 5 | ## Свойства 6 | 7 | ### sqlite / sqlite 8 | Доступ: Чтение 9 | 10 | ### MSSQLServer / MSSQLServer 11 | Доступ: Чтение -------------------------------------------------------------------------------- /oslib/packagedef: -------------------------------------------------------------------------------- 1 | 2 | Описание.Имя("sql") 3 | .Версия("1.3.2") 4 | .ВключитьФайл("Components") 5 | .ВключитьФайл("docs") 6 | .ВключитьФайл("tests") 7 | .ВключитьФайл("package-loader.os") 8 | .ВключитьФайл("packagedef") 9 | .ВключитьФайл("README.md"); 10 | -------------------------------------------------------------------------------- /docs/РезультатЗапроса.md: -------------------------------------------------------------------------------- 1 | # РезультатЗапроса / QueryResult 2 | 3 | Содержит результат выполнения запроса. Предназначен для хранения и обработки полученных данных. 4 | 5 | ## Методы 6 | 7 | ### Выгрузить / Unload() 8 | 9 | Создает таблицу значений и копирует в нее все записи набора. 10 | 11 | #### Возвращаемое значение 12 | 13 | ТаблицаЗначений 14 | 15 | ### Пустой / IsEmpty() 16 | 17 | Определяет, есть ли в результате записи 18 | 19 | #### Возвращаемое значение 20 | 21 | Булево. Истина - нет ни одной записи; Ложь - если есть записи. -------------------------------------------------------------------------------- /oscript-sql/IOScriptQuery.cs: -------------------------------------------------------------------------------- 1 | using OneScript.StandardLibrary.Collections; 2 | using ScriptEngine.Machine; 3 | using ScriptEngine.HostedScript.Library; 4 | 5 | namespace OScriptSql 6 | { 7 | interface IOScriptQuery : IValue 8 | { 9 | // props 10 | StructureImpl Parameters { get; } 11 | string Text { get; set; } 12 | 13 | // methods 14 | IValue Execute(); 15 | void SetParameter(string ParametrName, IValue ParametrValue); 16 | 17 | // my methods 18 | void SetConnection(DBConnector connector); 19 | 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | 2024-11-04 dmpas 2 | [added] Поддержка 2.0 3 | 4 | 2018-12-03 ret-Phoenix 5 | [added] Метод Пустой() - Булево. 6 | 7 | 2017-09-12 ret-Phoenix 8 | [fixed] Не всегда возвращало результат открытия соединения. 9 | 10 | 2017-03-09 ret-Phoenix 11 | 12 | [added] Запрос.Таймаут/Query.Timeout - Время в секундах, в течение которого должно происходить ожидание выполнения команды. По умолчанию используется значение 30 секунд. 13 | [fixed] Тесты, переделано на "#Использовать sql". 14 | [fixed] Документация, с учетом добавления свойства Таймаут. -------------------------------------------------------------------------------- /TestApp/TestApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | OScriptSql 6 | 2.0.0 7 | 2.0.0 8 | 2.0.0 9 | Exe 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /drafts/insert-select-ms-sql-server.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 3 | 4 | КоннекстМССКЛ = Новый Соединение(); 5 | КоннекстМССКЛ.ТипСУБД = КоннекстМССКЛ.ТипыСУБД.MSSQLServer; 6 | КоннекстМССКЛ.Сервер = "FIN91\SQLEXPRESS"; 7 | КоннекстМССКЛ.ИмяБазы = "test"; 8 | КоннекстМССКЛ.Открыть(); 9 | Сообщить("ОШИБКА:::" + КоннекстМССКЛ.ПоследнееСообщениеОбОшибке); 10 | 11 | ЗапросВставка = Новый Запрос(); 12 | ЗапросВставка.УстановитьСоединение(КоннекстМССКЛ); 13 | ЗапросВставка.Текст = "insert into users (login) values (@name)"; 14 | ЗапросВставка.УстановитьПараметр("name", "Игорь2"); 15 | ЗапросВставка.ВыполнитьКоманду(); 16 | 17 | Запрос = Новый Запрос(); 18 | Запрос.УстановитьСоединение(КоннекстМССКЛ); 19 | Запрос.Текст = "select * from users"; 20 | 21 | ТЗ = Запрос.Выполнить().Выгрузить(); 22 | 23 | Для каждого Стр Из ТЗ Цикл 24 | Сообщить(Стр.login) 25 | КонецЦикла; 26 | -------------------------------------------------------------------------------- /oscript-sql/oscript-sql.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {EA173D06-CCD2-45D5-A263-DC866289517A} 6 | Library 7 | OScriptSql 8 | 1script_sql 9 | net6.0 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /testcomponent.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | 3 | Соединение = Новый Соединение(); 4 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 5 | Соединение.ИмяБазы = ":memory:"; 6 | Соединение.Открыть(); 7 | 8 | Запрос = Новый Запрос(); 9 | Запрос.УстановитьСоединение(Соединение); 10 | Запрос.Текст = "Create table users (id integer, name text)"; 11 | Запрос.ВыполнитьКоманду(); 12 | 13 | Запрос.Текст = "insert into users (id, name) values(1, @name)"; 14 | Запрос.УстановитьПараметр("name", "Сергей"); 15 | Запрос.ВыполнитьКоманду(); 16 | 17 | Запрос.Текст = "insert into users (id, name) values(@id, @name)"; 18 | Запрос.УстановитьПараметр("id", "2"); 19 | Запрос.УстановитьПараметр("name", "Оксана"); 20 | Запрос.ВыполнитьКоманду(); 21 | 22 | Запрос2 = Новый Запрос(); 23 | Запрос2.УстановитьСоединение(Соединение); 24 | Запрос2.Текст = "select * from users where id = @id"; 25 | Запрос2.УстановитьПараметр("id", 1); 26 | ТЗ = Запрос2.Выполнить().Выгрузить(); 27 | 28 | Для каждого Стр Из ТЗ Цикл 29 | Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")") 30 | КонецЦикла; 31 | 32 | Соединение.Закрыть(); -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 ret-Phoenix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /oscript-sql/EnumDBType.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using OneScript.Contexts; 3 | 4 | namespace OScriptSql 5 | { 6 | /// 7 | /// Тип поддерживаемой СУБД 8 | /// 9 | [ContextClass("ТипСУБД", "DBType")] 10 | public class EnumDBType : AutoContext 11 | { 12 | /// 13 | /// Тип базы данных SQLite 14 | /// 15 | [ContextProperty("sqlite", "sqlite")] 16 | public int Sqlite => 0; 17 | 18 | /// 19 | /// Тип базы данных MSSQLServer 20 | /// 21 | [ContextProperty("MSSQLServer", "MSSQLServer")] 22 | public int MSSQLServer => 1; 23 | 24 | /// 25 | /// Тип базы данных MySQL 26 | /// 27 | [ContextProperty("MySQL", "MySQL")] 28 | public int MySQL => 2; 29 | 30 | /// 31 | /// Тип базы данных PostgreSQL 32 | /// 33 | [ContextProperty("PostgreSQL", "PostgreSQL")] 34 | public int PostgreSQL => 3; 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /examples/sqlite-in-memory.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 3 | 4 | Соединение = Новый Соединение(); 5 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 6 | Соединение.ИмяБазы = ":memory:"; 7 | Соединение.Открыть(); 8 | 9 | Запрос = Новый Запрос(); 10 | Запрос.УстановитьСоединение(Соединение); 11 | Запрос.Текст = "Create table users (id integer, name text)"; 12 | Запрос.ВыполнитьКоманду(); 13 | 14 | Запрос.Текст = "insert into users (id, name) values(1, @name)"; 15 | Запрос.УстановитьПараметр("name", "Сергей"); 16 | Запрос.ВыполнитьКоманду(); 17 | 18 | Запрос.Текст = "insert into users (id, name) values(@id, @name)"; 19 | Запрос.УстановитьПараметр("id", "2"); 20 | Запрос.УстановитьПараметр("name", "Оксана"); 21 | Запрос.ВыполнитьКоманду(); 22 | 23 | Запрос2 = Новый Запрос(); 24 | Запрос2.УстановитьСоединение(Соединение); 25 | Запрос2.Текст = "select * from users where id = @id"; 26 | Запрос2.УстановитьПараметр("id", 1); 27 | ТЗ = Запрос2.Выполнить().Выгрузить(); 28 | 29 | Для каждого Стр Из ТЗ Цикл 30 | Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")") 31 | КонецЦикла; 32 | 33 | Соединение.Закрыть(); -------------------------------------------------------------------------------- /oscript-sql.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25123.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "oscript-sql", "oscript-sql\oscript-sql.csproj", "{EA173D06-CCD2-45D5-A263-DC866289517A}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{EEA2A8E1-1094-4593-9B5E-6C7A626C1F13}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {EEA2A8E1-1094-4593-9B5E-6C7A626C1F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {EEA2A8E1-1094-4593-9B5E-6C7A626C1F13}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {EEA2A8E1-1094-4593-9B5E-6C7A626C1F13}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {EEA2A8E1-1094-4593-9B5E-6C7A626C1F13}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Работа с SQL базами для 1script 2 | 3 | Внешняя компонента реализующая возможность работы с базами данных из onescript. 4 | 5 | Поддерживаются базы: sqlite, MS SQL Server, MySQL, PostgreSQL 6 | 7 | Для коннектора sqlite позволяет работать с базой im memory. 8 | 9 | Имеется возможность писать запросы на выборку данных, использовать параметры запросах. 10 | 11 | Реализована возможность выполнения запросов DDL и DML. 12 | 13 | Если не подходит сборка sqlite выложенная в release - следует скачать подходящую с официального сайта [sqlite](http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki) 14 | 15 | Примечание: УстановитьПараметр принимает типы: Строка, Число, Дата, Булево 16 | 17 | 18 | ## Пример 19 | 20 | ```bsl 21 | Соединение = Новый Соединение(); 22 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 23 | Соединение.ИмяБазы = ":memory:"; 24 | Соединение.Открыть(); 25 | 26 | Запрос = Новый Запрос(); 27 | Запрос.УстановитьСоединение(Соединение); 28 | Запрос.Текст = "Create table users (id integer, name text)"; 29 | Запрос.ВыполнитьКоманду(); 30 | 31 | Запрос.Текст = "insert into users (id, name) values(1, @name)"; 32 | Запрос.УстановитьПараметр("name", "Сергей"); 33 | Запрос.ВыполнитьКоманду(); 34 | 35 | Запрос2 = Новый Запрос(); 36 | Запрос2.УстановитьСоединение(Соединение); 37 | Запрос2.Текст = "select * from users where id = @id"; 38 | Запрос2.УстановитьПараметр("id", 1); 39 | ТЗ = Запрос2.Выполнить().Выгрузить(); 40 | 41 | Для каждого Стр Из ТЗ Цикл 42 | Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")") 43 | КонецЦикла; 44 | ``` 45 | -------------------------------------------------------------------------------- /oslib/Components/net4/1script_sql.dll.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/Запрос.md: -------------------------------------------------------------------------------- 1 | # Запрос / Query 2 | 3 | Предназначен для выполнения запросов к базе данных. 4 | 5 | ## Свойства 6 | 7 | ### Параметры / Parameters 8 | Доступ: Чтение 9 | 10 | ### Текст / Text 11 | Доступ: Чтение/Запись 12 | 13 | Тип значения: Строка 14 | 15 | Содержит исходный текст выполняемого запроса. 16 | 17 | ### Таймаут / Timeout 18 | Доступ: Чтение/Запись 19 | 20 | Тип значения: Число 21 | 22 | Время в секундах, в течение которого должно происходить ожидание выполнения команды. По умолчанию используется значение 30 секунд. 23 | 24 | 25 | ## Методы 26 | 27 | ### Выполнить / Execute() 28 | 29 | Выполняет запрос к базе данных. 30 | 31 | #### Возвращаемое значение 32 | 33 | [РезультатЗапроса](РезультатЗапроса.md) 34 | 35 | ### ВыполнитьКоманду / ExecuteCommand() 36 | 37 | Выполняет запрос на модификацию к базе данных. 38 | 39 | #### Возвращаемое значение 40 | 41 | Число - Число обработанных строк. 42 | 43 | ### УстановитьПараметр / SetParameter() 44 | 45 | Устанавливает параметр запроса. Параметры доступны для обращения в тексте запроса. 46 | С помощью этого метода можно передавать переменные в запрос, например, для использования в условиях запроса. 47 | ВАЖНО: В запросе имя параметра указывается с использованием '@'. 48 | 49 | #### Пример: 50 | Запрос.Текст = "select * from mytable where category_id = @category_id"; 51 | Запрос.УстановитьПараметр("category_id", 1); 52 | 53 | 54 | #### Параметры 55 | 56 | * *ParametrName*: Строка - Имя параметра 57 | 58 | * *ParametrValue*: Произвольный - Значение параметра 59 | 60 | ### УстановитьСоединение / SetConnection() 61 | 62 | Установка соединения с БД. 63 | 64 | #### Параметры 65 | 66 | * *connector*: [Соединение](Соединение.md) - объект соединение с БД 67 | 68 | ### ИДПоследнейДобавленнойЗаписи 69 | 70 | Возвращает уникальный ид последней добавленной записи, работает для SQLite, MySQL 71 | 72 | #### Возвращаемое значение 73 | 74 | Число - уникальный ид последней добавленной записи. -------------------------------------------------------------------------------- /.github/workflows/ospx.yml: -------------------------------------------------------------------------------- 1 | name: OSPX 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: windows-latest 6 | steps: 7 | - uses: actions/checkout@v4 8 | with: 9 | fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis 10 | - name: preinstall os2 11 | shell: cmd 12 | run: | 13 | mkdir os2 14 | cd os2 15 | curl https://oscript.io/downloads/night-build/x64/fdd --output fdd.zip 16 | 7z x fdd.zip > NUL 17 | c:\windows\system32\cmd.exe /C bin\oscript.bat -version 18 | c:\windows\system32\cmd.exe /C bin\oscript.bat lib\opm\src\cmd\opm.os install opm 19 | cd .. 20 | - name: preinstall os1 21 | shell: cmd 22 | run: | 23 | mkdir os1 24 | cd os1 25 | curl https://oscript.io/downloads/latest/zip --output latest.zip 26 | 7z x latest.zip > NUL 27 | bin\oscript.exe -version 28 | bin\oscript.exe lib\opm\src\cmd\opm.os install opm 29 | cd .. 30 | - name: build 31 | run: dotnet publish --configuration Release 32 | - name: pack-and-install 33 | shell: cmd 34 | run: | 35 | cd oscript-sql\bin\Release\net6.0\publish 36 | del ScriptEngine*.dll NewtonSoft*.dll DotNetZip*.dll OneScript*.dll *.pdb 37 | cd ..\..\..\..\.. 38 | xcopy /E oscript-sql\bin\Release\net6.0\publish\* oslib\Components\dotnet\ 39 | cd oslib 40 | c:\windows\system32\cmd.exe /C ..\os2\bin\oscript.bat ..\os2\lib\opm\src\cmd\opm.os build . 41 | for %%X in (*.ospx) do (c:\windows\system32\cmd.exe /C ..\os2\bin\oscript.bat ..\os2\lib\opm\src\cmd\opm.os install -f %%X ) 42 | for %%X in (*.ospx) do (..\os1\bin\oscript.exe ..\os1\lib\opm\src\cmd\opm.os install -f %%X ) 43 | cd .. 44 | - name: test os1 45 | env: 46 | OSLIB_LOADER_TRACE: 1 47 | run: | 48 | os1\bin\oscript.exe testcomponent.os 49 | - name: test os2 50 | env: 51 | OSLIB_LOADER_TRACE: 1 52 | run: | 53 | c:\windows\system32\cmd.exe /C os2\bin\oscript.bat testcomponent.os 54 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: 1.3.2-{build} 2 | image: Visual Studio 2022 3 | environment: 4 | main_project: oscript-sql 5 | before_build: 6 | - ps: nuget restore 7 | init: 8 | - REG ADD "HKLM\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 65001>nul" /f 9 | - ps: Set-WinSystemLocale ru-RU 10 | - ps: Start-Sleep -s 15 11 | - ps: Restart-Computer 12 | install: 13 | - cmd: >- 14 | mkdir os2 15 | 16 | cd os2 17 | 18 | appveyor DownloadFile https://oscript.io/downloads/preview/OneScript-2.0.0-rc.7-fdd-x64.zip -FileName fdd.zip 19 | 20 | 7z x fdd.zip > NUL 21 | 22 | bin\oscript.bat -version 23 | 24 | bin\oscript.bat lib\opm\src\cmd\opm.os install opm 25 | 26 | cd .. 27 | 28 | - cmd: >- 29 | mkdir os1 30 | 31 | cd os1 32 | 33 | appveyor DownloadFile https://oscript.io/downloads/latest/zip -FileName latest.zip 34 | 35 | 7z x latest.zip > NUL 36 | 37 | bin\oscript.exe -version 38 | 39 | bin\oscript.exe lib\opm\src\cmd\opm.os install opm 40 | 41 | cd .. 42 | 43 | - cmd: >- 44 | 45 | appveyor DownloadFile https://github.com/dmpas/OneScriptDocumenter/releases/download/1.0.13/documenter.zip -FileName OneScriptDocumenter.zip 46 | 47 | 7z x OneScriptDocumenter.zip > NUL 48 | 49 | build: 50 | verbosity: minimal 51 | configuration: Release 52 | test_script: 53 | - cmd: dotnet nuget locals all --clear 54 | - cmd: >- 55 | set OSLIB_LOADER_TRACE=1 56 | 57 | os2\bin\oscript.bat testcomponent.os 58 | 59 | - cmd: >- 60 | set OSLIB_LOADER_TRACE=1 61 | 62 | os1\bin\oscript.exe testcomponent.os 63 | 64 | after_build: 65 | - ps: dotnet publish --no-build --configuration $env:Configuration 66 | - cmd: >- 67 | 68 | set BUILDDIR=%main_project%\bin\%CONFIGURATION%\net6.0\publish 69 | 70 | mkdir oslib\Components\dotnet 71 | 72 | OneScriptDocumenter.exe json oslib\Components\dotnet\syntaxHelp.json %BUILDDIR%\1script_%main_project%.dll 73 | 74 | del /F /Q %BUILDDIR%\ScriptEngine*.* %BUILDDIR%\NewtonSoft*.* %BUILDDIR%\DotNetZip*.* 75 | 76 | xcopy /E %BUILDDIR%\* oslib\Components\dotnet\ 77 | 78 | cd oslib 79 | 80 | ..\os2\bin\oscript.bat ..\os2\lib\opm\src\cmd\opm.os build . 81 | 82 | for %%X in (*.ospx) do (..\os2\bin\oscript.bat ..\os2\lib\opm\src\cmd\opm.os install -f %%X ) 83 | 84 | for %%X in (*.ospx) do (..\os1\bin\oscript.exe ..\os1\lib\opm\src\cmd\opm.os install -f %%X ) 85 | 86 | cd .. 87 | 88 | artifacts: 89 | - path: oslib\*.ospx 90 | name: sql 91 | -------------------------------------------------------------------------------- /docs/Соединение.md: -------------------------------------------------------------------------------- 1 | # Соединение / Connection 2 | 3 | Соединение с БД. Используется для указания источника данных объекта Запрос. 4 | 5 | ## Свойства 6 | 7 | ### ТипыСУБД / DBTypes 8 | Доступ: Чтение 9 | 10 | Тип значения: [ТипСУБД](#ТипСУБД.md) 11 | 12 | Типы поддерживаемых СУБД 13 | 14 | ### ТипСУБД / DBType 15 | Доступ: Чтение/Запись 16 | 17 | Тип значения: ТипСУБД 18 | 19 | Тип подключенной СУБД 20 | 21 | ### Порт / Port 22 | Доступ: Чтение/Запись 23 | 24 | Тип значения: Число 25 | 26 | Порт подключения 27 | 28 | ### Сервер / Server 29 | Доступ: Чтение/Запись 30 | 31 | Тип значения: Строка 32 | 33 | Имя или IP сервера 34 | 35 | ### ИмяБазы / DbName 36 | Доступ: Чтение/Запись 37 | 38 | Тип значения: Строка 39 | 40 | Имя базы, в случае с SQLITE - путь к базе 41 | 42 | ### ИмяПользователя / Login 43 | Доступ: Чтение/Запись 44 | 45 | Тип значения: Строка 46 | 47 | Пользователь под которым происходит подключение. 48 | Если СУБД MS SQL и пользователь не указан - используется Windows авторизация. 49 | 50 | ### Пароль / Password 51 | Доступ: Чтение/Запись 52 | 53 | Тип значения: Строка 54 | 55 | Пароль пользователя 56 | 57 | ### Открыто / IsOpen 58 | Доступ: Чтение 59 | 60 | Тип значения: Булево 61 | 62 | Статус соединения с БД: Открыто - Истина, Закрыто - Ложь. 63 | 64 | ### Состояние / State 65 | Доступ: Чтение 66 | 67 | Тип значения: ConnectionState 68 | 69 | Состояние соединения: 70 | 71 | - Closed - Закрыто. 72 | - Open - Открыто. 73 | - Connecting - Соединяется с источником. 74 | - Executing - Выполняет команду 75 | - Fetching - Получает данные 76 | - Broken - Соединение оборвано. 77 | 78 | ### ПоследнееСообщениеОбОшибке / LastErrorMessage 79 | Доступ: Чтение 80 | 81 | Тип значения: Строка 82 | 83 | Текст последней ошибки. 84 | 85 | ### СтрокаСоединения / ConnectionString 86 | Доступ: Чтение/Запись 87 | 88 | Тип значения: Строка 89 | 90 | Подготовленная строка соединения. В случае sqlite аналог ИмяБазы 91 | 92 | ## Методы 93 | 94 | ### Открыть / Open() 95 | 96 | Открыть соединение с БД 97 | 98 | #### Возвращаемое значение 99 | 100 | Булево 101 | 102 | ### Закрыть / Close() 103 | 104 | Закрыть соединение с БД 105 | 106 | ### СоздатьЗапрос / CreateQuery() 107 | 108 | Создать запрос с установленным соединением 109 | 110 | #### Возвращаемое значение 111 | 112 | Запрос 113 | -------------------------------------------------------------------------------- /TestApp/Program.cs: -------------------------------------------------------------------------------- 1 | /*---------------------------------------------------------- 2 | This Source Code Form is subject to the terms of the 3 | Mozilla Public License, v.2.0. If a copy of the MPL 4 | was not distributed with this file, You can obtain one 5 | at http://mozilla.org/MPL/2.0/. 6 | ----------------------------------------------------------*/ 7 | using System; 8 | using OneScript.StandardLibrary; 9 | using ScriptEngine.HostedScript; 10 | using ScriptEngine.HostedScript.Library; 11 | using ScriptEngine.Hosting; 12 | 13 | namespace TestApp 14 | { 15 | class MainClass : IHostApplication 16 | { 17 | 18 | static readonly string SCRIPT = @"// Отладочный скрипт в котором уже подключена наша компонента 19 | Соединение = Новый Соединение(); 20 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 21 | Соединение.ИмяБазы = "":memory:""; 22 | Соединение.Открыть(); 23 | 24 | Запрос = Новый Запрос(); 25 | Запрос.УстановитьСоединение(Соединение); 26 | Запрос.Текст = ""Create table users (id integer, name text)""; 27 | Запрос.ВыполнитьКоманду(); 28 | 29 | Запрос.Текст = ""insert into users (id, name) values(1, @name)""; 30 | Запрос.УстановитьПараметр(""name"", ""Сергей""); 31 | Запрос.ВыполнитьКоманду(); 32 | 33 | Запрос.Текст = ""insert into users (id, name) values(@id, @name)""; 34 | Запрос.УстановитьПараметр(""id"", ""2""); 35 | Запрос.УстановитьПараметр(""name"", ""Оксана""); 36 | Запрос.ВыполнитьКоманду(); 37 | 38 | Запрос2 = Новый Запрос(); 39 | Запрос2.УстановитьСоединение(Соединение); 40 | Запрос2.Текст = ""select * from users where id = @id""; 41 | 42 | Для Инд = 1 По 2 Цикл 43 | Запрос2.УстановитьПараметр(""id"", Инд); 44 | ТЗ = Запрос2.Выполнить().Выгрузить(); 45 | 46 | Для каждого Стр Из ТЗ Цикл 47 | Сообщить(""Имя: "" + Стр.Name + "" ("" + Стр.id + "")"") 48 | КонецЦикла; 49 | 50 | КонецЦикла; 51 | 52 | Соединение.Закрыть();" 53 | ; 54 | 55 | public static HostedScriptEngine StartEngine() 56 | { 57 | var mainEngine = DefaultEngineBuilder.Create() 58 | .SetDefaultOptions() 59 | .SetupEnvironment(envSetup => 60 | { 61 | envSetup.AddAssembly(typeof(OScriptSql.DBConnector).Assembly); 62 | }) 63 | .Build(); 64 | var engine = new HostedScriptEngine(mainEngine); 65 | engine.Initialize(); 66 | 67 | return engine; 68 | } 69 | 70 | public static void Main(string[] args) 71 | { 72 | var engine = StartEngine(); 73 | var script = engine.Loader.FromString(SCRIPT); 74 | var process = engine.CreateProcess(new MainClass(args), script); 75 | 76 | var result = process.Start(); 77 | 78 | Console.WriteLine("Result = {0}", result); 79 | } 80 | 81 | private string[] args; 82 | 83 | public MainClass(string[] args) 84 | { 85 | this.args = args; 86 | } 87 | 88 | public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) 89 | { 90 | Console.WriteLine(str); 91 | } 92 | 93 | public void ShowExceptionInfo(Exception exc) 94 | { 95 | Console.WriteLine(exc.ToString()); 96 | } 97 | 98 | public bool InputString(out string result, string prompt, int maxLen, bool multiline) 99 | { 100 | throw new NotImplementedException(); 101 | } 102 | 103 | public bool InputString(out string result, int maxLen) 104 | { 105 | throw new NotSupportedException(); 106 | } 107 | 108 | public string[] GetCommandLineArguments() 109 | { 110 | return args; 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /oscript-sql/QueryResult.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using OneScript.Contexts; 3 | using ScriptEngine.Machine; 4 | 5 | using System; 6 | using System.Data.Common; 7 | using OneScript.StandardLibrary.Binary; 8 | using OneScript.StandardLibrary.Collections.ValueTable; 9 | 10 | namespace OScriptSql 11 | { 12 | /// 13 | /// Содержит результат выполнения запроса. Предназначен для хранения и обработки полученных данных. 14 | /// 15 | [ContextClass("РезультатЗапроса", "QueryResult")] 16 | public class QueryResult : AutoContext 17 | { 18 | private DbDataReader _reader; 19 | 20 | /// 21 | /// Создает новый экземпляр класса РезультатЗапроса. 22 | /// 23 | public QueryResult() 24 | { 25 | } 26 | 27 | /// 28 | /// Создает новый экземпляр класса РезультатЗапроса. 29 | /// 30 | /// Чтение 31 | public QueryResult(DbDataReader reader) 32 | { 33 | _reader = reader; 34 | } 35 | 36 | /// 37 | /// Определяет, есть ли в результате записи 38 | /// 39 | /// Булево. Истина - нет ни одной записи; Ложь - если есть записи. 40 | [ContextMethod("Пустой", "IsEmpty")] 41 | public bool IsEmpty() 42 | { 43 | return !_reader.HasRows; 44 | 45 | } 46 | 47 | /// 48 | /// Создает таблицу значений и копирует в нее все записи набора. 49 | /// 50 | /// ТаблицаЗначений 51 | [ContextMethod("Выгрузить", "Unload")] 52 | public ValueTable Unload() 53 | { 54 | 55 | ValueTable resultTable = new ValueTable(); 56 | 57 | for (int ColIdx = 0; ColIdx < _reader.FieldCount; ColIdx++) 58 | { 59 | resultTable.Columns.Add(_reader.GetName(ColIdx)); 60 | } 61 | 62 | foreach (DbDataRecord record in _reader) 63 | { 64 | ValueTableRow row = resultTable.Add(); 65 | 66 | for (int ColIdx = 0; ColIdx < _reader.FieldCount; ColIdx++) 67 | { 68 | if (record.IsDBNull(ColIdx)) 69 | { 70 | row.Set(ColIdx, ValueFactory.Create()); 71 | continue; 72 | } 73 | 74 | 75 | if (record.GetFieldType(ColIdx) == typeof(SByte)) 76 | { 77 | row.Set(ColIdx, ValueFactory.Create((int)record.GetValue(ColIdx))); 78 | } 79 | else if (record.GetFieldType(ColIdx) == typeof(Int32)) 80 | { 81 | row.Set(ColIdx, ValueFactory.Create((int)record.GetValue(ColIdx))); 82 | } 83 | else if (record.GetFieldType(ColIdx) == typeof(Int64)) 84 | { 85 | row.Set(ColIdx, ValueFactory.Create(record.GetInt64(ColIdx))); 86 | } 87 | else if (record.GetFieldType(ColIdx) == typeof(Boolean)) 88 | { 89 | row.Set(ColIdx, ValueFactory.Create(record.GetBoolean(ColIdx))); 90 | } 91 | else if (record.GetFieldType(ColIdx) == typeof(UInt64)) 92 | { 93 | row.Set(ColIdx, ValueFactory.Create(record.GetValue(ColIdx).ToString())); 94 | } 95 | else if (record.GetFieldType(ColIdx).ToString() == "System.Double") 96 | { 97 | double val = record.GetDouble(ColIdx); 98 | row.Set(ColIdx, ValueFactory.Create(val.ToString())); 99 | } 100 | else if (record.GetFieldType(ColIdx) == typeof(Single)) 101 | { 102 | float val = record.GetFloat(ColIdx); 103 | row.Set(ColIdx, ValueFactory.Create(val.ToString())); 104 | } 105 | else if (record.GetFieldType(ColIdx) == typeof(Decimal)) 106 | { 107 | row.Set(ColIdx, ValueFactory.Create(record.GetDecimal(ColIdx))); 108 | } 109 | else if (record.GetFieldType(ColIdx).ToString() == "System.String") 110 | { 111 | row.Set(ColIdx, ValueFactory.Create(record.GetString(ColIdx))); 112 | } 113 | else if (record.GetFieldType(ColIdx).ToString() == "System.DateTime") 114 | { 115 | row.Set(ColIdx, ValueFactory.Create(record.GetDateTime(ColIdx))); 116 | } 117 | else if (record.GetFieldType(ColIdx).ToString() == "System.TimeSpan") 118 | { 119 | row.Set(ColIdx, ValueFactory.Create(new DateTime() + (TimeSpan)record[ColIdx])); 120 | } 121 | else if (record.GetFieldType(ColIdx).ToString() == "System.Byte[]") 122 | { 123 | var data = (byte[])record[ColIdx]; 124 | var newData = new BinaryDataContext(data); 125 | row.Set(ColIdx, newData); 126 | } 127 | else if (record.GetDataTypeName(ColIdx) == "uniqueidentifier") 128 | { 129 | row.Set(ColIdx, ValueFactory.Create(record.GetValue(ColIdx).ToString())); 130 | } 131 | else if (record.GetDataTypeName(ColIdx) == "tinyint") 132 | { 133 | row.Set(ColIdx, ValueFactory.Create((int)record.GetByte(ColIdx))); 134 | } 135 | else 136 | { 137 | row.Set(ColIdx, ValueFactory.Create(record.GetString(ColIdx))); 138 | } 139 | 140 | } 141 | } 142 | _reader.Close(); 143 | return resultTable; 144 | } 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /tests/test-mysql.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | Перем мСтрокаСоединения; 6 | 7 | Функция ПолучитьТекстИзФайла(ИмяФайла) 8 | ФайлОбмена = Новый Файл(ИмяФайла); 9 | Данные = ""; 10 | Если ФайлОбмена.Существует() Тогда 11 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 12 | Данные = Текст.Прочитать(); 13 | Текст.Закрыть(); 14 | Иначе 15 | Возврат Ложь; 16 | КонецЕсли; 17 | возврат Данные; 18 | КонецФункции 19 | 20 | Процедура Инициализация() 21 | КонецПроцедуры 22 | 23 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 24 | 25 | СуфикМетодов = ""; 26 | мСтрокаСоединения = ПолучитьТекстИзФайла("fixtures\mysql-con-str.txt"); 27 | Если мСтрокаСоединения = Ложь Тогда 28 | СуфикМетодов = "НетПараметровСоединения"; 29 | КонецЕсли; 30 | 31 | 32 | юТест = Тестирование; 33 | 34 | СписокТестов = Новый Массив; 35 | СписокТестов.Добавить("Тест_Должен_ПроверитьГенерациюСтрокиСоединения"); 36 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьГенерациюСтрокиСоединения() Экспорт 46 | 47 | Соединение = Новый Соединение(); 48 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 49 | Соединение.Сервер = "localhost"; 50 | Соединение.ИмяПользователя = "root"; 51 | Соединение.ИмяБазы = "test"; 52 | Соединение.Пароль = "testpassword"; 53 | Соединение.Порт = 3306; 54 | 55 | Попытка 56 | /// Заведомо известно падение при открытии. 57 | /// Строка соединения генерируется только при открытии 58 | Соединение.Открыть(); 59 | Исключение 60 | Ожидаем.Что(Соединение.СтрокаСоединения).Равно("server=localhost;user=root;password=testpassword;database=test;port=3306;"); 61 | КонецПопытки; 62 | 63 | 64 | КонецПроцедуры 65 | 66 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 67 | 68 | Соединение = Новый Соединение(); 69 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 70 | Соединение.СтрокаСоединения = мСтрокаСоединения; 71 | Соединение.Открыть(); 72 | 73 | ЗапросВставка = Новый Запрос(); 74 | ЗапросВставка.УстановитьСоединение(Соединение); 75 | 76 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 77 | ЗапросВставка.ВыполнитьКоманду(); 78 | 79 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 80 | ЗапросВставка.ВыполнитьКоманду(); 81 | 82 | Соединение.Закрыть(); 83 | 84 | КонецПроцедуры 85 | 86 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 87 | 88 | Соединение = Новый Соединение(); 89 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 90 | Соединение.СтрокаСоединения = мСтрокаСоединения; 91 | Соединение.Открыть(); 92 | 93 | ЗапросВставка = Новый Запрос(); 94 | ЗапросВставка.УстановитьСоединение(Соединение); 95 | 96 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 97 | ЗапросВставка.ВыполнитьКоманду(); 98 | 99 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 100 | ЗапросВставка.ВыполнитьКоманду(); 101 | 102 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 103 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 104 | Результат = ЗапросВставка.ВыполнитьКоманду(); 105 | 106 | Соединение.Закрыть(); 107 | 108 | Ожидаем.Что(Результат).Равно(1); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 113 | 114 | Соединение = Новый Соединение(); 115 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 116 | Соединение.СтрокаСоединения = мСтрокаСоединения; 117 | Соединение.Открыть(); 118 | 119 | ЗапросВставка = Новый Запрос(); 120 | ЗапросВставка.УстановитьСоединение(Соединение); 121 | 122 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users1"; 123 | ЗапросВставка.ВыполнитьКоманду(); 124 | 125 | ЗапросВставка.Текст = "Create table users1 (id integer, name varchar(50), born date, isadmin bool)"; 126 | ЗапросВставка.ВыполнитьКоманду(); 127 | 128 | ЗапросВставка.Текст = "insert into users1 (id, name, born, isadmin) values(@id, @name, @born, @isadmin)"; 129 | ЗапросВставка.УстановитьПараметр("id", "1"); 130 | ЗапросВставка.УстановитьПараметр("isadmin", Истина); 131 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 132 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 133 | ЗапросВставка.ВыполнитьКоманду(); 134 | 135 | ЗапросВставка.Текст = "update users1 set name = @name"; 136 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 137 | Результат = ЗапросВставка.ВыполнитьКоманду(); 138 | 139 | ЗапросВставка.Параметры.Очистить(); 140 | ЗапросВставка.Текст = "select * from users1"; 141 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 142 | 143 | // Для каждого СтрТЗ Из ТЗ Цикл 144 | // Сообщить("id:" +СтрТЗ.id); 145 | // Сообщить("name:" + СтрТЗ.name); 146 | // Сообщить("born:" + СтрТЗ.born); 147 | // Сообщить("isadmin:" + СтрТЗ.isadmin); 148 | // КонецЦикла; 149 | 150 | Соединение.Закрыть(); 151 | 152 | Ожидаем.Что(Результат).Равно(1); 153 | 154 | КонецПроцедуры 155 | 156 | 157 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 158 | 159 | Соединение = Новый Соединение(); 160 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 161 | Соединение.СтрокаСоединения = мСтрокаСоединения; 162 | Соединение.Открыть(); 163 | 164 | ЗапросВставка = Новый Запрос(); 165 | ЗапросВставка.УстановитьСоединение(Соединение); 166 | 167 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 168 | ЗапросВставка.ВыполнитьКоманду(); 169 | 170 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 171 | ЗапросВставка.ВыполнитьКоманду(); 172 | 173 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 174 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 175 | ЗапросВставка.ВыполнитьКоманду(); 176 | 177 | ЗапросВставка.Параметры.Очистить(); 178 | ЗапросВставка.Текст = "select * from users"; 179 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 180 | 181 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 182 | 183 | Соединение.Закрыть(); 184 | 185 | КонецПроцедуры 186 | 187 | ////////////////////////////////////////////////////////////////////////////////////// 188 | // Инициализация 189 | 190 | Инициализация(); 191 | -------------------------------------------------------------------------------- /tests/test-pgsql.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | Перем мСтрокаСоединения; 6 | 7 | Функция ПолучитьТекстИзФайла(ИмяФайла) 8 | ФайлОбмена = Новый Файл(ИмяФайла); 9 | Данные = ""; 10 | Если ФайлОбмена.Существует() Тогда 11 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 12 | Данные = Текст.Прочитать(); 13 | Текст.Закрыть(); 14 | Иначе 15 | Возврат Ложь; 16 | КонецЕсли; 17 | возврат Данные; 18 | КонецФункции 19 | 20 | Процедура Инициализация() 21 | КонецПроцедуры 22 | 23 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 24 | 25 | СуфикМетодов = ""; 26 | мСтрокаСоединения = ПолучитьТекстИзФайла("fixtures\pgsql-con-str.txt"); 27 | Если мСтрокаСоединения = Ложь Тогда 28 | СуфикМетодов = "НетПараметровСоединения"; 29 | КонецЕсли; 30 | 31 | 32 | юТест = Тестирование; 33 | 34 | СписокТестов = Новый Массив; 35 | СписокТестов.Добавить("Тест_Должен_ПроверитьГенерациюСтрокиСоединения"); 36 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьГенерациюСтрокиСоединения() Экспорт 46 | 47 | Соединение = Новый Соединение(); 48 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 49 | Соединение.Сервер = "localhost"; 50 | Соединение.ИмяПользователя = "postgres"; 51 | Соединение.ИмяБазы = "test"; 52 | Соединение.Пароль = "testpassword"; 53 | Соединение.Порт = 3306; 54 | 55 | Попытка 56 | /// Заведомо известно падение при открытии. 57 | /// Строка соединения генерируется только при открытии 58 | Соединение.Открыть(); 59 | Исключение 60 | Ожидаем.Что(Соединение.СтрокаСоединения).Равно("Host=localhost;Username=postgres;Password=testpassword;Database=test;port=3306;"); 61 | КонецПопытки; 62 | 63 | 64 | КонецПроцедуры 65 | 66 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 67 | 68 | Соединение = Новый Соединение(); 69 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 70 | Соединение.СтрокаСоединения = мСтрокаСоединения; 71 | Соединение.Открыть(); 72 | 73 | ЗапросВставка = Новый Запрос(); 74 | ЗапросВставка.УстановитьСоединение(Соединение); 75 | 76 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 77 | ЗапросВставка.ВыполнитьКоманду(); 78 | 79 | ЗапросВставка.Текст = "Create table users (id integer, title varchar(50))"; 80 | ЗапросВставка.ВыполнитьКоманду(); 81 | 82 | Соединение.Закрыть(); 83 | 84 | КонецПроцедуры 85 | 86 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 87 | 88 | Соединение = Новый Соединение(); 89 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 90 | Соединение.СтрокаСоединения = мСтрокаСоединения; 91 | Соединение.Открыть(); 92 | 93 | ЗапросВставка = Новый Запрос(); 94 | ЗапросВставка.УстановитьСоединение(Соединение); 95 | 96 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testdata"; 97 | ЗапросВставка.ВыполнитьКоманду(); 98 | 99 | ЗапросВставка.Текст = "Create table testdata (userlogin varchar(50))"; 100 | ЗапросВставка.ВыполнитьКоманду(); 101 | 102 | ЗапросВставка.Текст = "INSERT INTO testdata (userlogin) VALUES (@value1)"; 103 | ЗапросВставка.УстановитьПараметр("value1", "Tom&jerry"); 104 | Результат = ЗапросВставка.ВыполнитьКоманду(); 105 | 106 | Соединение.Закрыть(); 107 | 108 | Ожидаем.Что(Результат).Равно(1); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 113 | 114 | Соединение = Новый Соединение(); 115 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 116 | Соединение.СтрокаСоединения = мСтрокаСоединения; 117 | Соединение.Открыть(); 118 | 119 | ЗапросВставка = Новый Запрос(); 120 | ЗапросВставка.УстановитьСоединение(Соединение); 121 | 122 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users1"; 123 | ЗапросВставка.ВыполнитьКоманду(); 124 | 125 | ЗапросВставка.Текст = "Create table users1 (id integer, name varchar(50), born date, isadmin bool)"; 126 | ЗапросВставка.ВыполнитьКоманду(); 127 | 128 | ЗапросВставка.Текст = "insert into users1 (id, name, born, isadmin) values(@id, @name, @born, @isadmin)"; 129 | ЗапросВставка.УстановитьПараметр("id", 1); 130 | ЗапросВставка.УстановитьПараметр("isadmin", Истина); 131 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 132 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 133 | ЗапросВставка.ВыполнитьКоманду(); 134 | 135 | ЗапросВставка.Текст = "update users1 set name = @name"; 136 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 137 | Результат = ЗапросВставка.ВыполнитьКоманду(); 138 | 139 | Соединение.Закрыть(); 140 | 141 | Ожидаем.Что(Результат).Равно(1); 142 | 143 | КонецПроцедуры 144 | 145 | 146 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 147 | 148 | Соединение = Новый Соединение(); 149 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 150 | Соединение.СтрокаСоединения = мСтрокаСоединения; 151 | Соединение.Открыть(); 152 | 153 | ЗапросВставка = Новый Запрос(); 154 | ЗапросВставка.УстановитьСоединение(Соединение); 155 | 156 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 157 | ЗапросВставка.ВыполнитьКоманду(); 158 | 159 | ЗапросВставка.Текст = "Create table users (id integer, title varchar(50))"; 160 | ЗапросВставка.ВыполнитьКоманду(); 161 | 162 | ЗапросВставка.Текст = "insert into users (id, title) values(@id, @title)"; 163 | ЗапросВставка.УстановитьПараметр("id", 1); 164 | ЗапросВставка.УстановитьПараметр("title", "Сергей"); 165 | ЗапросВставка.ВыполнитьКоманду(); 166 | 167 | ЗапросВставка.Текст = "insert into users (id, title) values(@id, @title)"; 168 | ЗапросВставка.УстановитьПараметр("id", 2); 169 | ЗапросВставка.УстановитьПараметр("title", "Оксана"); 170 | ЗапросВставка.ВыполнитьКоманду(); 171 | 172 | ЗапросВставка.Параметры.Очистить(); 173 | ЗапросВставка.Текст = "select * from users where id = @newid"; 174 | ЗапросВставка.УстановитьПараметр("newid", 1); 175 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 176 | 177 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 178 | 179 | Соединение.Закрыть(); 180 | 181 | КонецПроцедуры 182 | 183 | ////////////////////////////////////////////////////////////////////////////////////// 184 | // Инициализация 185 | 186 | Инициализация(); -------------------------------------------------------------------------------- /tests/test-ms-sql-server.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьТекстИзФайла(ИмяФайла) 7 | ФайлОбмена = Новый Файл(ИмяФайла); 8 | Данные = ""; 9 | Если ФайлОбмена.Существует() Тогда 10 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 11 | Данные = Текст.Прочитать(); 12 | Текст.Закрыть(); 13 | Иначе 14 | Возврат Ложь; 15 | КонецЕсли; 16 | возврат Данные; 17 | КонецФункции 18 | 19 | Процедура Инициализация() 20 | КонецПроцедуры 21 | 22 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 23 | 24 | СуфикМетодов = ""; 25 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 26 | Если СтрокаСоединения = Ложь Тогда 27 | СуфикМетодов = "НетПараметровСоединения"; 28 | КонецЕсли; 29 | 30 | 31 | юТест = Тестирование; 32 | 33 | СписокТестов = Новый Массив; 34 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединение" + СуфикМетодов); 35 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 36 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПроверитьТаймаут" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьСоединение() Экспорт 46 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 47 | 48 | Соединение = Новый Соединение(); 49 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 50 | Соединение.СтрокаСоединения = СтрокаСоединения; 51 | 52 | Результат = Соединение.Открыть(); 53 | 54 | Ожидаем.Что(Результат).Равно(Результат); 55 | 56 | Соединение.Закрыть(); 57 | 58 | КонецПроцедуры 59 | 60 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 61 | 62 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 63 | 64 | Соединение = Новый Соединение(); 65 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 66 | Соединение.СтрокаСоединения = СтрокаСоединения; 67 | 68 | Соединение.Открыть(); 69 | ЗапросВставка = Новый Запрос(); 70 | ЗапросВставка.УстановитьСоединение(Соединение); 71 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 72 | ЗапросВставка.ВыполнитьКоманду(); 73 | 74 | Соединение.Закрыть(); 75 | 76 | КонецПроцедуры 77 | 78 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 79 | 80 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 81 | 82 | Соединение = Новый Соединение(); 83 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 84 | Соединение.СтрокаСоединения = СтрокаСоединения; 85 | Соединение.Открыть(); 86 | 87 | ЗапросВставка = Новый Запрос(); 88 | ЗапросВставка.УстановитьСоединение(Соединение); 89 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 90 | ЗапросВставка.ВыполнитьКоманду(); 91 | 92 | ЗапросВставка.Текст = "insert into #users (name) values(@name)"; 93 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 94 | Результат = ЗапросВставка.ВыполнитьКоманду(); 95 | 96 | Соединение.Закрыть(); 97 | 98 | Ожидаем.Что(Результат).Равно(1); 99 | 100 | КонецПроцедуры 101 | 102 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 103 | 104 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 105 | 106 | Соединение = Новый Соединение(); 107 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 108 | Соединение.СтрокаСоединения = СтрокаСоединения; 109 | Соединение.Открыть(); 110 | 111 | ЗапросВставка = Новый Запрос(); 112 | ЗапросВставка.УстановитьСоединение(Соединение); 113 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 114 | ЗапросВставка.ВыполнитьКоманду(); 115 | 116 | ЗапросВставка.Текст = "insert into #users (id, name) values(1, @name)"; 117 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 118 | ЗапросВставка.ВыполнитьКоманду(); 119 | 120 | ЗапросВставка.Текст = "update #users set name = @name"; 121 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 122 | Результат = ЗапросВставка.ВыполнитьКоманду(); 123 | 124 | Соединение.Закрыть(); 125 | 126 | Ожидаем.Что(Результат).Равно(1); 127 | 128 | КонецПроцедуры 129 | 130 | 131 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 132 | 133 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 134 | 135 | Соединение = Новый Соединение(); 136 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 137 | Соединение.СтрокаСоединения = СтрокаСоединения; 138 | Соединение.Открыть(); 139 | 140 | ЗапросВставка = Новый Запрос(); 141 | ЗапросВставка.УстановитьСоединение(Соединение); 142 | 143 | ЗапросВставка.Текст = "IF OBJECT_ID(N'#users', N'U') IS NOT NULL DROP TABLE #users;"; 144 | ЗапросВставка.ВыполнитьКоманду(); 145 | 146 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50), born date)"; 147 | ЗапросВставка.ВыполнитьКоманду(); 148 | 149 | ЗапросВставка.Текст = "insert into #users (id, name, born) values(@id, @name, @born)"; 150 | ЗапросВставка.Параметры.Очистить(); 151 | ЗапросВставка.УстановитьПараметр("id", 1); 152 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 153 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 154 | ЗапросВставка.ВыполнитьКоманду(); 155 | 156 | ЗапросВставка.Текст = "select * from #users WHERE id = @id"; 157 | // ЗапросВставка.Текст = "select * from users"; 158 | ЗапросВставка.Параметры.Очистить(); 159 | ЗапросВставка.УстановитьПараметр("id", 1); 160 | Рез = ЗапросВставка.Выполнить(); 161 | ТЗ = Рез.Выгрузить(); 162 | 163 | // Для каждого СтрТЗ Из ТЗ Цикл 164 | // Сообщить("id:" +СтрТЗ.id); 165 | // Сообщить("name:" + СтрТЗ.name); 166 | // Сообщить("born:" + СтрТЗ.born); 167 | // КонецЦикла; 168 | 169 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 170 | 171 | Соединение.Закрыть(); 172 | 173 | КонецПроцедуры 174 | 175 | Процедура Тест_Должен_ДолженПроверитьТаймаут() Экспорт 176 | 177 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 178 | 179 | Соединение = Новый Соединение(); 180 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 181 | Соединение.СтрокаСоединения = СтрокаСоединения; 182 | Соединение.Открыть(); 183 | 184 | ЗапросВставка = Новый Запрос(); 185 | ЗапросВставка.УстановитьСоединение(Соединение); 186 | ЗапросВставка.Таймаут = 1; 187 | 188 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 189 | ЗапросВставка.ВыполнитьКоманду(); 190 | 191 | ЗапросВставка.Текст = "insert into #users (id, name) values(1, @name)"; 192 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 193 | ЗапросВставка.ВыполнитьКоманду(); 194 | 195 | ЗапросВставка.Текст = "update #users set name = @name"; 196 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 197 | Результат = ЗапросВставка.ВыполнитьКоманду(); 198 | 199 | Соединение.Закрыть(); 200 | 201 | Ожидаем.Что(Результат).Равно(1); 202 | КонецПроцедуры 203 | 204 | ////////////////////////////////////////////////////////////////////////////////////// 205 | // Инициализация 206 | 207 | Инициализация(); 208 | -------------------------------------------------------------------------------- /tests/test-reader.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьТекстИзФайла(ИмяФайла) 7 | ФайлОбмена = Новый Файл(ИмяФайла); 8 | Данные = ""; 9 | Если ФайлОбмена.Существует() Тогда 10 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 11 | Данные = Текст.Прочитать(); 12 | Текст.Закрыть(); 13 | Иначе 14 | Возврат Ложь; 15 | КонецЕсли; 16 | возврат Данные; 17 | КонецФункции 18 | 19 | Процедура Инициализация() 20 | КонецПроцедуры 21 | 22 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 23 | 24 | Суфикс = "НетПараметровДоступа"; 25 | 26 | юТест = Тестирование; 27 | 28 | СписокТестов = Новый Массив; 29 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_sqlite"+Суфикс); 30 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_mssqlserver"+Суфикс); 31 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_mysql"+Суфикс); 32 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_postgresql"+Суфикс); 33 | 34 | Возврат СписокТестов; 35 | 36 | КонецФункции 37 | 38 | Процедура Тест_Должен_ПрочитатьДанные_sqlite() Экспорт 39 | 40 | Соединение = Новый Соединение(); 41 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 42 | Соединение.ИмяБазы = ":memory:"; 43 | Соединение.Открыть(); 44 | 45 | ЗапросВставка = Новый Запрос(); 46 | ЗапросВставка.УстановитьСоединение(Соединение); 47 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 text, col3 REAL, col4 NUMERIC, col5 blob)"; 48 | ЗапросВставка.ВыполнитьКоманду(); 49 | 50 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5 ) values (@col1, @col2, @col3, @col4, @col5)"; 51 | ЗапросВставка.УстановитьПараметр("col1", 1); 52 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 53 | ЗапросВставка.УстановитьПараметр("col3", 1.1234567890); 54 | ЗапросВставка.УстановитьПараметр("col4", 1.1234567890); 55 | ЗапросВставка.УстановитьПараметр("col5", "Большой текст"); 56 | ЗапросВставка.ВыполнитьКоманду(); 57 | 58 | ЗапросВставка.Текст = "select * from testtypes"; 59 | ЗапросВставка.Параметры.Очистить(); 60 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 61 | 62 | Для каждого СтрТЗ Из ТЗ Цикл 63 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 64 | Сообщить("" + А + ":" + СтрТЗ[А]); 65 | КонецЦикла; 66 | КонецЦикла; 67 | 68 | КонецПроцедуры 69 | 70 | Процедура Тест_Должен_ПрочитатьДанные_mssqlserver() Экспорт 71 | 72 | Соединение = Новый Соединение(); 73 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 74 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 75 | Соединение.Открыть(); 76 | 77 | ЗапросВставка = Новый Запрос(); 78 | ЗапросВставка.УстановитьСоединение(Соединение); 79 | 80 | ЗапросВставка.Текст = "IF OBJECT_ID(N'testtypes', N'U') IS NOT NULL DROP TABLE testtypes;"; 81 | ЗапросВставка.ВыполнитьКоманду(); 82 | 83 | 84 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 datetime, col5 bit, col6 float, col7 ntext)"; 85 | ЗапросВставка.ВыполнитьКоманду(); 86 | 87 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 88 | ЗапросВставка.УстановитьПараметр("col1", 1); 89 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 90 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 91 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 92 | ЗапросВставка.УстановитьПараметр("col5", Истина); 93 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 94 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 95 | ЗапросВставка.ВыполнитьКоманду(); 96 | 97 | ЗапросВставка.Текст = "select * from testtypes"; 98 | ЗапросВставка.Параметры.Очистить(); 99 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 100 | 101 | Для каждого СтрТЗ Из ТЗ Цикл 102 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 103 | Сообщить("" + А + ":" + СтрТЗ[А]); 104 | КонецЦикла; 105 | КонецЦикла; 106 | 107 | КонецПроцедуры 108 | 109 | Процедура Тест_Должен_ПрочитатьДанные_mysql() Экспорт 110 | 111 | Соединение = Новый Соединение(); 112 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 113 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\mysql-con-str.txt"); 114 | Соединение.Открыть(); 115 | 116 | ЗапросВставка = Новый Запрос(); 117 | ЗапросВставка.УстановитьСоединение(Соединение); 118 | 119 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testtypes;"; 120 | ЗапросВставка.ВыполнитьКоманду(); 121 | 122 | 123 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 datetime, col5 bit, col6 float, col7 text)"; 124 | ЗапросВставка.ВыполнитьКоманду(); 125 | 126 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 127 | ЗапросВставка.УстановитьПараметр("col1", 1); 128 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 129 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 130 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 131 | ЗапросВставка.УстановитьПараметр("col5", Истина); 132 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 133 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 134 | ЗапросВставка.ВыполнитьКоманду(); 135 | 136 | ЗапросВставка.Текст = "select * from testtypes"; 137 | ЗапросВставка.Параметры.Очистить(); 138 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 139 | 140 | Для каждого СтрТЗ Из ТЗ Цикл 141 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 142 | Сообщить("" + А + ":" + СтрТЗ[А]); 143 | КонецЦикла; 144 | КонецЦикла; 145 | 146 | КонецПроцедуры 147 | 148 | Процедура Тест_Должен_ПрочитатьДанные_postgresql() Экспорт 149 | 150 | Соединение = Новый Соединение(); 151 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 152 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\pgsql-con-str.txt"); 153 | Соединение.Открыть(); 154 | 155 | ЗапросВставка = Новый Запрос(); 156 | ЗапросВставка.УстановитьСоединение(Соединение); 157 | 158 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testtypes;"; 159 | ЗапросВставка.ВыполнитьКоманду(); 160 | 161 | 162 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 date, col5 boolean, col6 float, col7 text)"; 163 | ЗапросВставка.ВыполнитьКоманду(); 164 | 165 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 166 | ЗапросВставка.УстановитьПараметр("col1", 1); 167 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 168 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 169 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 170 | ЗапросВставка.УстановитьПараметр("col5", Истина); 171 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 172 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 173 | ЗапросВставка.ВыполнитьКоманду(); 174 | 175 | ЗапросВставка.Текст = "select * from testtypes"; 176 | ЗапросВставка.Параметры.Очистить(); 177 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 178 | 179 | Для каждого СтрТЗ Из ТЗ Цикл 180 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 181 | Сообщить("" + А + ":" + СтрТЗ[А]); 182 | КонецЦикла; 183 | КонецЦикла; 184 | 185 | КонецПроцедуры 186 | 187 | 188 | ////////////////////////////////////////////////////////////////////////////////////// 189 | // Инициализация 190 | 191 | Инициализация(); 192 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | { 10 | "version": "2.0.0", 11 | "_runner": "terminal", 12 | "windows": { 13 | "command": "cmd", 14 | "args": ["/c", "chcp 65001 &&"] 15 | }, 16 | "linux": { 17 | "command": "sh", 18 | "args": ["-c"] 19 | }, 20 | "isShellCommand": true, 21 | // "showOutput": "silent", 22 | "_runner": "terminal", 23 | "tasks": [ 24 | { 25 | "taskName": "Testing project", 26 | "args": [ 27 | "1testrunner", 28 | "-runall", 29 | "${workspaceRoot}/tests" 30 | ], 31 | "echoCommand": true, 32 | "showOutput": "always", 33 | "suppressTaskName": true, 34 | // "isBuildCommand": false, 35 | "isTestCommand": false, 36 | "problemMatcher": { 37 | "fileLocation": "absolute", 38 | "pattern": { 39 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 40 | "file": 1, 41 | "location": 2, 42 | "message": 3 43 | } 44 | } 45 | }, 46 | { 47 | "taskName": "Testing current test-file", 48 | "args": [ 49 | "1testrunner", 50 | "-run", 51 | "${file}", 52 | ], 53 | "echoCommand": true, 54 | "showOutput": "always", 55 | "suppressTaskName": true, 56 | "isBuildCommand": false, 57 | "isTestCommand": true, 58 | "problemMatcher": { 59 | "fileLocation": "absolute", 60 | "pattern": { 61 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 62 | "file": 1, 63 | "location": 2, 64 | "message": 3 65 | } 66 | } 67 | }, 68 | { 69 | "taskName": "Exec all features", 70 | "args": [ 71 | "1bdd", 72 | "${workspaceRoot}/features", 73 | "-out", 74 | "${workspaceRoot}/exec.log" 75 | ], 76 | "echoCommand": true, 77 | "showOutput": "always", 78 | "suppressTaskName": true, 79 | "isBuildCommand": true, 80 | "isTestCommand": false, 81 | "problemMatcher": { 82 | "fileLocation": "absolute", 83 | "pattern": { 84 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 85 | "file": 1, 86 | "location": 2, 87 | "message": 3 88 | } 89 | } 90 | }, 91 | { 92 | "taskName": "Exec feature", 93 | "args": [ 94 | "1bdd", 95 | "${file}", 96 | "-out", 97 | "${workspaceRoot}/exec.log" 98 | ], 99 | "echoCommand": true, 100 | "showOutput": "always", 101 | "suppressTaskName": true, 102 | "isBuildCommand": false, 103 | "isTestCommand": true, 104 | "problemMatcher": { 105 | "fileLocation": "absolute", 106 | "pattern": [ 107 | { 108 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 109 | "file": 1, 110 | "location": 2, 111 | "message": 3 112 | } 113 | ] 114 | } 115 | }, 116 | { 117 | "taskName": "Exec feature for current step def", 118 | "args": [ 119 | "1bdd", 120 | "${fileDirname}/../${fileBasenameNoExtension}.feature", 121 | "-fail-fast", 122 | "-out", 123 | "${workspaceRoot}/exec.log" 124 | ], 125 | "echoCommand": true, 126 | "showOutput": "always", 127 | "suppressTaskName": true, 128 | "isBuildCommand": false, 129 | "isTestCommand": true, 130 | "problemMatcher": { 131 | "fileLocation": "absolute", 132 | "pattern": [ 133 | { 134 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 135 | "file": 1, 136 | "location": 2, 137 | "message": 3 138 | } 139 | ] 140 | } 141 | }, 142 | { 143 | "taskName": "Generate feature steps", 144 | "args": [ 145 | "1bdd", 146 | "gen", 147 | "${file}", 148 | "-out", 149 | "${workspaceRoot}/exec.log" 150 | ], 151 | "echoCommand": true, 152 | "showOutput": "always", 153 | "suppressTaskName": true, 154 | "isBuildCommand": false, 155 | "isTestCommand": false, 156 | "problemMatcher": { 157 | "fileLocation": "absolute", 158 | "pattern": { 159 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 160 | "file": 1, 161 | "location": 2, 162 | "message": 3 163 | } 164 | } 165 | }, 166 | { 167 | "taskName": "Opm: package build", 168 | "args": [ 169 | "opm", 170 | "build", 171 | "${workspaceRoot}" 172 | ], 173 | "echoCommand": true, 174 | "showOutput": "always", 175 | "suppressTaskName": true, 176 | "isBuildCommand": false 177 | }, 178 | { 179 | "taskName": "OneScript: compile", 180 | "args": [ 181 | "oscript", 182 | "-encoding=utf-8", 183 | "-compile", 184 | "${file}" 185 | ], 186 | "echoCommand": true, 187 | "showOutput": "always", 188 | "suppressTaskName": true, 189 | "isBuildCommand": false 190 | }, 191 | { 192 | "taskName": "OneScript: check", 193 | "args": [ 194 | "oscript", 195 | "-encoding=utf-8", 196 | "-check", 197 | "${file}" 198 | ], 199 | "echoCommand": true, 200 | "showOutput": "always", 201 | "suppressTaskName": true, 202 | "isBuildCommand": false 203 | }, 204 | { 205 | "taskName": "OneScript: make", 206 | "args": [ 207 | "oscript", 208 | "-encoding=utf-8", 209 | "-make", 210 | "${file}", 211 | "${fileBasename}.exe" 212 | ], 213 | "echoCommand": true, 214 | "showOutput": "always", 215 | "suppressTaskName": true, 216 | "isBuildCommand": false 217 | }, 218 | { 219 | "taskName": "OneScript: run", 220 | "args": [ 221 | "oscript", 222 | "-encoding=utf-8", 223 | "${file}" 224 | ], 225 | "echoCommand": true, 226 | "showOutput": "always", 227 | "suppressTaskName": true, 228 | "isBuildCommand": true, 229 | "problemMatcher": { 230 | "fileLocation": "absolute", 231 | "pattern": { 232 | "regexp": "^{Модуль\\s+(.*)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+(.*)}$", 233 | "file": 1, 234 | "location": 2, 235 | "message": 3 236 | } 237 | } 238 | } 239 | ] 240 | } -------------------------------------------------------------------------------- /oscript-sql/SQLQuery.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using OneScript.Contexts; 3 | using ScriptEngine.Machine; 4 | using ScriptEngine.HostedScript.Library; 5 | using System.Data.SQLite; 6 | using System.Data.Common; 7 | using System.Data.SqlClient; 8 | using MySql.Data.MySqlClient; 9 | using Npgsql; 10 | using System; 11 | using OneScript.StandardLibrary.Binary; 12 | using OneScript.StandardLibrary.Collections; 13 | using OneScript.Values; 14 | 15 | namespace OScriptSql 16 | { 17 | /// 18 | /// Предназначен для выполнения запросов к базе данных. 19 | /// 20 | [ContextClass("Запрос", "Query")] 21 | public class Query : AutoContext, IOScriptQuery 22 | { 23 | 24 | private string _text; 25 | private DbConnection _connection; 26 | private DbCommand _command; 27 | private StructureImpl _parameters; 28 | 29 | private DBConnector _connector; 30 | 31 | /// 32 | /// Создает новый экземпляр класса Запрос. 33 | /// 34 | public Query() 35 | { 36 | _parameters = new StructureImpl(); 37 | _text = ""; 38 | } 39 | 40 | /// 41 | /// Создает новый экземпляр класса Запрос. 42 | /// 43 | /// Запрос 44 | [ScriptConstructor] 45 | public static IRuntimeContextInstance Constructor() 46 | { 47 | return new Query(); 48 | } 49 | 50 | /// 51 | /// Параметры запроса 52 | /// 53 | [ContextProperty("Параметры", "Parameters")] 54 | public StructureImpl Parameters => _parameters; 55 | 56 | 57 | /// 58 | /// Управление таймауотом 59 | /// 60 | /// Число 61 | [ContextProperty("Таймаут", "Timeout")] 62 | public int Timeout 63 | { 64 | get { return _command.CommandTimeout; } 65 | set 66 | { 67 | _command.CommandTimeout = value; 68 | } 69 | } 70 | 71 | /// 72 | /// Содержит исходный текст выполняемого запроса. 73 | /// 74 | /// Строка 75 | [ContextProperty("Текст", "Text")] 76 | public string Text 77 | { 78 | get { return _text; } 79 | set 80 | { 81 | _text = value; 82 | } 83 | } 84 | 85 | private void SetDbCommandParameters() 86 | { 87 | DbParameter param = null; 88 | 89 | foreach (IValue prm in _parameters) 90 | { 91 | var paramVal = ((KeyAndValueImpl)prm).Value; 92 | var paramKey = ((KeyAndValueImpl)prm).Key.AsString(); 93 | 94 | param = _command.CreateParameter(); 95 | param.ParameterName = "@" + paramKey; 96 | switch (paramVal) 97 | { 98 | case BslStringValue _stringValue: 99 | param.Value = _stringValue.AsString(); 100 | break; 101 | case BslNumericValue _numericValue: 102 | param.Value = _numericValue.AsNumber(); 103 | break; 104 | case BslDateValue _dateValue: 105 | param.Value = _dateValue.AsDate(); 106 | break; 107 | case BslBooleanValue _bslBooleanValue: 108 | param.Value = _bslBooleanValue.AsBoolean(); 109 | break; 110 | case BinaryDataContext _binaryDataContext: 111 | param.Value = _binaryDataContext.Buffer; 112 | break; 113 | case BslUndefinedValue _ : 114 | param.Value = DBNull.Value; 115 | break; 116 | } 117 | _command.Parameters.Add(param); 118 | } 119 | 120 | } 121 | 122 | /// 123 | /// Выполняет запрос к базе данных. 124 | /// 125 | /// РезультатЗапроса 126 | [ContextMethod("Выполнить", "Execute")] 127 | public IValue Execute() 128 | { 129 | _command.Parameters.Clear(); 130 | _command.CommandText = _text; 131 | 132 | SetDbCommandParameters(); 133 | DbDataReader reader = _command.ExecuteReader(); 134 | QueryResult result = new QueryResult(reader); 135 | return result; 136 | } 137 | 138 | /// 139 | /// Выполняет запрос к базе данных. Cиноним для Выполнить 140 | /// 141 | /// РезультатЗапроса 142 | [ContextMethod("ВыполнитьЗапрос", "ExecuteQuery")] 143 | public IValue ExecuteQuery() 144 | { 145 | return Execute(); 146 | } 147 | 148 | /// 149 | /// Выполняет запрос на модификацию к базе данных. 150 | /// 151 | /// Число - Число обработанных строк. 152 | [ContextMethod("ВыполнитьКоманду", "ExecuteCommand")] 153 | public int ExecuteCommand() 154 | { 155 | _command.Parameters.Clear(); 156 | _command.CommandText = _text; 157 | SetDbCommandParameters(); 158 | return _command.ExecuteNonQuery(); 159 | } 160 | 161 | /// 162 | /// Устанавливает параметр запроса. Параметры доступны для обращения в тексте запроса. 163 | /// С помощью этого метода можно передавать переменные в запрос, например, для использования в условиях запроса. 164 | /// ВАЖНО: В запросе имя параметра указывается с использованием '@'. 165 | /// 166 | /// 167 | /// Запрос.Текст = "select * from mytable where category_id = @category_id"; 168 | /// Запрос.УстановитьПараметр("category_id", 1); 169 | /// 170 | /// Строка - Имя параметра 171 | /// Произвольный - Значение параметра 172 | [ContextMethod("УстановитьПараметр", "SetParameter")] 173 | public void SetParameter(string ParametrName, IValue ParametrValue) 174 | { 175 | _parameters.Insert(ParametrName, ParametrValue); 176 | } 177 | 178 | /// 179 | /// Установка соединения с БД. 180 | /// 181 | /// Соединение - объект соединение с БД 182 | [ContextMethod("УстановитьСоединение", "SetConnection")] 183 | public void SetConnection(DBConnector connector) 184 | { 185 | _connector = connector; 186 | _connection = connector.Connection; 187 | 188 | if (_connector.DbType == new EnumDBType().Sqlite) 189 | { 190 | _command = _connection.CreateCommand(); 191 | } 192 | else if (_connector.DbType == new EnumDBType().MSSQLServer) 193 | { 194 | _command = new SqlCommand 195 | { 196 | Connection = (SqlConnection)connector.Connection 197 | }; 198 | } 199 | else if (_connector.DbType == new EnumDBType().MySQL) 200 | { 201 | _command = new MySqlCommand 202 | { 203 | Connection = (MySqlConnection)connector.Connection 204 | }; 205 | } 206 | else if (_connector.DbType == new EnumDBType().PostgreSQL) 207 | { 208 | _command = new NpgsqlCommand 209 | { 210 | Connection = (NpgsqlConnection)connector.Connection 211 | }; 212 | } 213 | 214 | } 215 | 216 | /// 217 | /// Возвращает идентификатор последней добавленной записи. 218 | /// 219 | /// Число - идентификатор записи 220 | [ContextMethod("ИДПоследнейДобавленнойЗаписи", "LastInsertRowId")] 221 | public int LastInsertRowId() 222 | { 223 | if (_connector.DbType == new EnumDBType().Sqlite) 224 | { 225 | return (int)((SQLiteConnection)_connection).LastInsertRowId; 226 | } 227 | else if (_connector.DbType == new EnumDBType().MSSQLServer) 228 | { 229 | return -1; 230 | } 231 | else if (_connector.DbType == new EnumDBType().MySQL) 232 | { 233 | return (int)((MySqlCommand)_command).LastInsertedId; 234 | } 235 | else if (_connector.DbType == new EnumDBType().PostgreSQL) 236 | { 237 | return -1; 238 | } 239 | return -1; 240 | } 241 | 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /tests/test-sqlite.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Процедура Инициализация() 7 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 8 | КонецПроцедуры 9 | 10 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 11 | 12 | юТест = Тестирование; 13 | 14 | СписокТестов = Новый Массив; 15 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединениеОткрыто"); 16 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединениеЗакрыто"); 17 | СписокТестов.Добавить("Тест_Должен_ВернутьСтатусОткрыто"); 18 | СписокТестов.Добавить("Тест_Должен_ВернутьСтатусЗакрыто"); 19 | СписокТестов.Добавить("Тест_Должен_СоздатьБД"); 20 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу"); 21 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки"); 22 | СписокТестов.Добавить("Тест_Должен_ВернутьИДДобавленнойтроки"); 23 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки"); 24 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку"); 25 | 26 | СписокТестов.Добавить("Тест_Должен_СоздатьИнМемориБД"); 27 | СписокТестов.Добавить("Тест_Должен_СоздатьИнМемориБДИзСоединения"); 28 | 29 | СписокТестов.Добавить("Тест_Должен_ВернутьРезультатЗапросаПустой"); 30 | СписокТестов.Добавить("Тест_Должен_ВернутьРезультатЗапросаНеПустой"); 31 | 32 | Возврат СписокТестов; 33 | 34 | КонецФункции 35 | 36 | Процедура Тест_Должен_ПроверитьСоединениеОткрыто() Экспорт 37 | Соединение = Новый Соединение(); 38 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 39 | Соединение.ИмяБазы = ":memory:"; 40 | Соединение.Открыть(); 41 | Ожидаем.Что(Соединение.Открыто).ЭтоИстина(); 42 | Соединение.Закрыть(); 43 | КонецПроцедуры 44 | 45 | Процедура Тест_Должен_ПроверитьСоединениеЗакрыто() Экспорт 46 | Соединение = Новый Соединение(); 47 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 48 | Соединение.ИмяБазы = ":memory:"; 49 | Соединение.Открыть(); 50 | Соединение.Закрыть(); 51 | Ожидаем.Что(Соединение.Открыто).ЭтоЛожь(); 52 | КонецПроцедуры 53 | 54 | Процедура Тест_Должен_ВернутьСтатусОткрыто() Экспорт 55 | Соединение = Новый Соединение(); 56 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 57 | Соединение.ИмяБазы = ":memory:"; 58 | Соединение.Открыть(); 59 | Ожидаем.Что(Соединение.Состояние).Равно("Open"); 60 | Соединение.Закрыть(); 61 | КонецПроцедуры 62 | 63 | Процедура Тест_Должен_ВернутьСтатусЗакрыто() Экспорт 64 | Соединение = Новый Соединение(); 65 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 66 | Соединение.ИмяБазы = ":memory:"; 67 | Соединение.Открыть(); 68 | Соединение.Закрыть(); 69 | Ожидаем.Что(Соединение.Состояние).Равно("Closed"); 70 | КонецПроцедуры 71 | 72 | Процедура Тест_Должен_СоздатьБД() Экспорт 73 | 74 | ФайлБД = Новый Файл("fixtures\test.sqlite"); 75 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 76 | Если (ФайлБД.Существует()) Тогда 77 | УдалитьФайлы(ПолноеИмяБД); 78 | КонецЕсли; 79 | 80 | Соединение = Новый Соединение(); 81 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 82 | Соединение.ИмяБазы = ПолноеИмяБД; 83 | Соединение.Открыть(); 84 | Соединение.Закрыть(); 85 | 86 | Ожидаем.Что(ФайлБД.Существует()).ЭтоИстина(); 87 | 88 | Освободитьобъект(ФайлБД); 89 | 90 | УдалитьФайлы(ПолноеИмяБД); 91 | 92 | КонецПроцедуры 93 | 94 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 95 | 96 | ФайлБД = Новый Файл("fixtures\test-create-table.sqlite"); 97 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 98 | Если (ФайлБД.Существует()) Тогда 99 | УдалитьФайлы(ПолноеИмяБД); 100 | КонецЕсли; 101 | 102 | Соединение = Новый Соединение(); 103 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 104 | Соединение.ИмяБазы = ПолноеИмяБД; 105 | Соединение.Открыть(); 106 | 107 | ЗапросВставка = Новый Запрос(); 108 | ЗапросВставка.УстановитьСоединение(Соединение); 109 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 110 | ЗапросВставка.ВыполнитьКоманду(); 111 | 112 | Соединение.Закрыть(); 113 | 114 | КонецПроцедуры 115 | 116 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 117 | 118 | ФайлБД = Новый Файл("fixtures\test-table-add.sqlite"); 119 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 120 | Если (ФайлБД.Существует()) Тогда 121 | УдалитьФайлы(ПолноеИмяБД); 122 | КонецЕсли; 123 | 124 | Соединение = Новый Соединение(); 125 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 126 | Соединение.ИмяБазы = ПолноеИмяБД; 127 | Соединение.Открыть(); 128 | 129 | ЗапросВставка = Новый Запрос(); 130 | ЗапросВставка.УстановитьСоединение(Соединение); 131 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 132 | ЗапросВставка.ВыполнитьКоманду(); 133 | 134 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 135 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 136 | Результат = ЗапросВставка.ВыполнитьКоманду(); 137 | 138 | Соединение.Закрыть(); 139 | 140 | Ожидаем.Что(Результат).Равно(1); 141 | 142 | КонецПроцедуры 143 | 144 | Процедура Тест_Должен_ВернутьИДДобавленнойтроки() Экспорт 145 | 146 | Соединение = Новый Соединение(); 147 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 148 | Соединение.ИмяБазы = ":memory:"; 149 | Соединение.Открыть(); 150 | 151 | ЗапросВставка = Новый Запрос(); 152 | ЗапросВставка.УстановитьСоединение(Соединение); 153 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 154 | ЗапросВставка.ВыполнитьКоманду(); 155 | 156 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 157 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 158 | Результат = ЗапросВставка.ВыполнитьКоманду(); 159 | 160 | Ожидаем.Что(ЗапросВставка.ИДПоследнейДобавленнойЗаписи()).Равно(1); 161 | Соединение.Закрыть(); 162 | 163 | 164 | КонецПроцедуры 165 | 166 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 167 | 168 | ФайлБД = Новый Файл("fixtures\test-table-edit.sqlite"); 169 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 170 | Если (ФайлБД.Существует()) Тогда 171 | УдалитьФайлы(ПолноеИмяБД); 172 | КонецЕсли; 173 | 174 | Соединение = Новый Соединение(); 175 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 176 | Соединение.ИмяБазы = ПолноеИмяБД; 177 | Соединение.Открыть(); 178 | 179 | ЗапросВставка = Новый Запрос(); 180 | ЗапросВставка.УстановитьСоединение(Соединение); 181 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 182 | ЗапросВставка.ВыполнитьКоманду(); 183 | 184 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 185 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 186 | ЗапросВставка.ВыполнитьКоманду(); 187 | 188 | ЗапросВставка.Текст = "update users set name = @name"; 189 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 190 | Результат = ЗапросВставка.ВыполнитьКоманду(); 191 | 192 | Соединение.Закрыть(); 193 | 194 | Ожидаем.Что(Результат).Равно(1); 195 | 196 | КонецПроцедуры 197 | 198 | 199 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 200 | 201 | ФайлБД = Новый Файл("fixtures\test-table-select.sqlite"); 202 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 203 | Если (ФайлБД.Существует()) Тогда 204 | УдалитьФайлы(ПолноеИмяБД); 205 | КонецЕсли; 206 | 207 | Соединение = Новый Соединение(); 208 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 209 | Соединение.ИмяБазы = ПолноеИмяБД; 210 | Соединение.Открыть(); 211 | 212 | ЗапросВставка = Новый Запрос(); 213 | ЗапросВставка.УстановитьСоединение(Соединение); 214 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 215 | ЗапросВставка.ВыполнитьКоманду(); 216 | 217 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 218 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 219 | ЗапросВставка.ВыполнитьКоманду(); 220 | 221 | ЗапросВставка.Текст = "select * from users"; 222 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 223 | 224 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 225 | 226 | Соединение.Закрыть(); 227 | 228 | КонецПроцедуры 229 | 230 | Процедура Тест_Должен_СоздатьИнМемориБД() Экспорт 231 | 232 | Соединение = Новый Соединение(); 233 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 234 | Соединение.ИмяБазы = ":memory:"; 235 | Соединение.Открыть(); 236 | 237 | ЗапросВставка = Новый Запрос(); 238 | ЗапросВставка.УстановитьСоединение(Соединение); 239 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 240 | ЗапросВставка.ВыполнитьКоманду(); 241 | 242 | ЗапросВставка.Текст = "insert into users (id, name) values (@id, @name)"; 243 | ЗапросВставка.УстановитьПараметр("id", 1); 244 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 245 | ЗапросВставка.ВыполнитьКоманду(); 246 | 247 | ЗапросВставка.Текст = "select * from users"; 248 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 249 | 250 | // Для каждого СтрТЗ Из ТЗ Цикл 251 | // Сообщить("id:" +СтрТЗ.id); 252 | // Сообщить("name:" + СтрТЗ.name); 253 | // // Сообщить("born:" + СтрТЗ.born); 254 | // КонецЦикла; 255 | 256 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 257 | Ожидаем.Что(ТЗ[0][1]).Равно("Сергей"); 258 | 259 | Соединение.Закрыть(); 260 | 261 | 262 | КонецПроцедуры 263 | 264 | Процедура Тест_Должен_СоздатьИнМемориБДИзСоединения() Экспорт 265 | 266 | Соединение = Новый Соединение(); 267 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 268 | Соединение.ИмяБазы = ":memory:"; 269 | Соединение.Открыть(); 270 | 271 | Запрос = Соединение.СоздатьЗапрос(); 272 | Запрос.Текст = "Create table users1 (id integer, name text)"; 273 | Запрос.ВыполнитьКоманду(); 274 | 275 | Соединение.Закрыть(); 276 | 277 | Освободитьобъект(Соединение); 278 | 279 | КонецПроцедуры 280 | 281 | Процедура Тест_Должен_ВернутьРезультатЗапросаПустой() Экспорт 282 | 283 | Соединение = Новый Соединение(); 284 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 285 | Соединение.ИмяБазы = ":memory:"; 286 | Соединение.Открыть(); 287 | 288 | Запрос = Соединение.СоздатьЗапрос(); 289 | Запрос.Текст = "select * from SQLITE_MASTER where type = 999"; 290 | РезультатЗапроса = Запрос.Выполнить(); 291 | 292 | Ожидаем.Что(РезультатЗапроса.Пустой()).ЭтоИстина(); 293 | 294 | Соединение.Закрыть(); 295 | 296 | Освободитьобъект(Соединение); 297 | 298 | 299 | КонецПроцедуры 300 | 301 | Процедура Тест_Должен_ВернутьРезультатЗапросаНеПустой() Экспорт 302 | 303 | Соединение = Новый Соединение(); 304 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 305 | Соединение.ИмяБазы = ":memory:"; 306 | Соединение.Открыть(); 307 | 308 | Запрос = Соединение.СоздатьЗапрос(); 309 | Запрос.Текст = "select 1"; 310 | РезультатЗапроса = Запрос.Выполнить(); 311 | 312 | Ожидаем.Что(РезультатЗапроса.Пустой()).ЭтоЛожь(); 313 | 314 | Соединение.Закрыть(); 315 | 316 | Освободитьобъект(Соединение); 317 | 318 | 319 | КонецПроцедуры 320 | 321 | ////////////////////////////////////////////////////////////////////////////////////// 322 | // Инициализация 323 | 324 | Инициализация(); 325 | -------------------------------------------------------------------------------- /oslib/package-loader.os: -------------------------------------------------------------------------------- 1 | // Пояснения по переменным даны в конце модуля 2 | Перем ПоказатьСообщенияЗагрузки; 3 | Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей; 4 | 5 | Перем КэшМодулей; 6 | 7 | Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) 8 | Вывести(" 9 | |ПриЗагрузкеБиблиотеки " + Путь); 10 | 11 | ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "lib.config")); 12 | 13 | Если ФайлМанифеста.Существует() Тогда 14 | Вывести("Обрабатываем по манифесту"); 15 | 16 | СтандартнаяОбработка = Ложь; 17 | ОбработатьМанифест(ФайлМанифеста.ПолноеИмя, Путь, Отказ); 18 | Иначе 19 | СтандартнаяОбработка = Ложь; 20 | Вывести("Обрабатываем структуру каталогов по соглашению"); 21 | ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ); 22 | КонецЕсли; 23 | 24 | КонецПроцедуры 25 | 26 | Процедура ОбработатьМанифест(Знач Файл, Знач Путь, Отказ) 27 | 28 | Чтение = Новый ЧтениеXML; 29 | Чтение.ОткрытьФайл(Файл); 30 | Чтение.ПерейтиКСодержимому(); 31 | 32 | Если Чтение.ЛокальноеИмя <> "package-def" Тогда 33 | Отказ = Истина; 34 | Чтение.Закрыть(); 35 | Возврат; 36 | КонецЕсли; 37 | 38 | Пока Чтение.Прочитать() Цикл 39 | 40 | Если Чтение.ТипУзла = ТипУзлаXML.Комментарий Тогда 41 | 42 | Продолжить; 43 | 44 | КонецЕсли; 45 | 46 | Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 47 | 48 | Если Чтение.ЛокальноеИмя = "class" Тогда 49 | ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file")); 50 | Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда 51 | Идентификатор = Чтение.ЗначениеАтрибута("name"); 52 | Если Не ПустаяСтрока(Идентификатор) Тогда 53 | Вывести(СтрШаблон(" класс %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя)); 54 | 55 | // ДобавитьКласс(ФайлКласса.ПолноеИмя, Идентификатор); 56 | ДобавитьКлассЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор); 57 | КонецЕсли; 58 | Иначе 59 | ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте"; 60 | КонецЕсли; 61 | 62 | Чтение.Прочитать(); // в конец элемента 63 | КонецЕсли; 64 | 65 | Если Чтение.ЛокальноеИмя = "module" Тогда 66 | ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file")); 67 | Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда 68 | Идентификатор = Чтение.ЗначениеАтрибута("name"); 69 | Если Не ПустаяСтрока(Идентификатор) Тогда 70 | Вывести(СтрШаблон(" модуль %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя)); 71 | Попытка 72 | ДобавитьМодульЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор); 73 | Исключение 74 | Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда 75 | ВызватьИсключение; 76 | КонецЕсли; 77 | Вывести("Предупреждение: 78 | | " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); 79 | КонецПопытки; 80 | КонецЕсли; 81 | Иначе 82 | ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте"; 83 | КонецЕсли; 84 | 85 | Чтение.Прочитать(); // в конец элемента 86 | КонецЕсли; 87 | 88 | КонецЕсли; 89 | 90 | КонецЦикла; 91 | 92 | Чтение.Закрыть(); 93 | 94 | КонецПроцедуры 95 | 96 | Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ) 97 | 98 | КаталогиКлассов = Новый Массив; 99 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Классы")); 100 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Classes")); 101 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Классы")); 102 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Classes")); 103 | 104 | КаталогиМодулей = Новый Массив; 105 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Модули")); 106 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Modules")); 107 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Модули")); 108 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Modules")); 109 | 110 | КаталогиВК = Новый Массив; 111 | КаталогиВК.Добавить(ОбъединитьПути(Путь, "Components")); 112 | КаталогиВК.Добавить(ОбъединитьПути(Путь, "Компоненты")); 113 | 114 | Для Каждого мКаталог Из КаталогиКлассов Цикл 115 | 116 | ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ); 117 | 118 | КонецЦикла; 119 | 120 | Для Каждого мКаталог Из КаталогиМодулей Цикл 121 | 122 | ОбработатьКаталогМодулей(мКаталог, СтандартнаяОбработка, Отказ); 123 | 124 | КонецЦикла; 125 | 126 | Для Каждого мКаталог Из КаталогиВК Цикл 127 | 128 | ОбработатьКаталогВК(мКаталог, СтандартнаяОбработка, Отказ); 129 | 130 | КонецЦикла; 131 | 132 | КонецПроцедуры 133 | 134 | Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ) 135 | 136 | КаталогКлассов = Новый Файл(Путь); 137 | 138 | Если КаталогКлассов.Существует() Тогда 139 | Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); 140 | Для Каждого Файл Из Файлы Цикл 141 | Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); 142 | СтандартнаяОбработка = Ложь; 143 | // ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 144 | ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 145 | КонецЦикла; 146 | КонецЕсли; 147 | 148 | КонецПроцедуры 149 | 150 | Процедура ОбработатьКаталогМодулей(Знач Путь, СтандартнаяОбработка, Отказ) 151 | 152 | КаталогМодулей = Новый Файл(Путь); 153 | 154 | Если КаталогМодулей.Существует() Тогда 155 | Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os"); 156 | Для Каждого Файл Из Файлы Цикл 157 | Вывести(СтрШаблон(" модуль (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); 158 | СтандартнаяОбработка = Ложь; 159 | Попытка 160 | ДобавитьМодульЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 161 | Исключение 162 | Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда 163 | ВызватьИсключение; 164 | КонецЕсли; 165 | СтандартнаяОбработка = Истина; 166 | Вывести("Предупреждение: 167 | |" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); 168 | КонецПопытки; 169 | КонецЦикла; 170 | КонецЕсли; 171 | 172 | КонецПроцедуры 173 | 174 | // По соглашению ВК должны лежать в подпапках, названных, как значения перечисления ТипПлатформы. 175 | // Имя файла, являющегося внешней компонентой должно иметь префикс 1script_ 176 | // Components 177 | // net4 (фреймворк .net48 178 | // 1script_barcode.dll 179 | // dotnet (.net современных версий, он же netcore) 180 | // 1script_barcode.dll 181 | // NativeApi 182 | // Windows_x86 183 | // 1script_barcode.dll 184 | // Windows_x86_64 185 | // 1script_barcode.dll 186 | // Linux_x86_64 187 | // 1script_barcode.so 188 | // остальные не поддерживаются (ЖВПР) 189 | // 190 | Процедура ОбработатьКаталогВК(Знач Путь, СтандартнаяОбработка, Отказ) 191 | 192 | СИ = Новый СистемнаяИнформация(); 193 | МажорнаяВерсия = Лев(СИ.Версия,1); 194 | 195 | Если МажорнаяВерсия = "1" Тогда 196 | ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "net4")); 197 | ИначеЕсли МажорнаяВерсия = "2" Тогда 198 | ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "dotnet")); 199 | Иначе 200 | Вывести("Неизвестная мажорная версия системы: " + МажорнаяВерсия); 201 | КонецЕсли; 202 | 203 | ОбработатьКомпонентыNativeApi(Путь); 204 | 205 | КонецПроцедуры 206 | 207 | Процедура ОбработатьБиблиотекиCLR(Путь) 208 | КандидатыВКомпоненты = НайтиФайлы(Путь, "1script_*.dll"); 209 | Для Каждого Кандидат Из КандидатыВКомпоненты Цикл 210 | Если Не Кандидат.ЭтоФайл() Тогда 211 | Продолжить; 212 | КонецЕсли; 213 | 214 | Вывести("Загружаю файл " + Кандидат.Имя); 215 | ЗагрузитьБиблиотеку(Кандидат.ПолноеИмя); 216 | 217 | КонецЦикла; 218 | КонецПроцедуры 219 | 220 | Процедура ОбработатьКомпонентыNativeApi(Путь) 221 | СИ = Новый СистемнаяИнформация; 222 | ИмяПодкаталога = ОбъединитьПути(Путь, Строка(СИ.ТипПлатформы)); 223 | Вывести("Ищу внешние компоненты в каталоге " + Путь); 224 | 225 | #Если Windows Тогда 226 | Расширение = ".dll"; 227 | #Иначе 228 | Расширение = ".so"; 229 | #КонецЕсли 230 | 231 | КандидатыВКомпоненты = НайтиФайлы(ИмяПодкаталога, "1script_*"+Расширение); 232 | Для Каждого Кандидат Из КандидатыВКомпоненты Цикл 233 | Если Не Кандидат.ЭтоФайл() Тогда 234 | Продолжить; 235 | КонецЕсли; 236 | 237 | Вывести("Загружаю файл " + Кандидат.Имя); 238 | ПодключитьВнешнююКомпоненту(Кандидат.ПолноеИмя, Кандидат.Имя, ТипВнешнейКомпоненты.Native); 239 | 240 | КонецЦикла; 241 | КонецПроцедуры 242 | 243 | Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса) 244 | Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса); 245 | Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда 246 | Вывести("Добавляю класс " + ИмяКласса); 247 | ДобавитьКласс(ПутьФайла, ИмяКласса); 248 | Возврат; 249 | КонецЕсли; 250 | 251 | КлассУжеЕсть = Ложь; 252 | Попытка 253 | ИзвестныйТип = Тип(ИмяКласса); 254 | КлассУжеЕсть = Истина; 255 | Исключение 256 | СообщениеОшибки = ОписаниеОшибки(); 257 | ШаблонОшибки = НСтр("ru = 'Тип не зарегистрирован (%1)';en = 'Type is not registered (%1)'"); 258 | ИскомаяОшибка = СтрШаблон(ШаблонОшибки, ИмяКласса); 259 | КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0; 260 | КонецПопытки; 261 | Если Не КлассУжеЕсть Тогда 262 | 263 | Вывести("Добавляю класс, т.к. он не найден - " + ИмяКласса); 264 | ДобавитьКласс(ПутьФайла, ИмяКласса); 265 | 266 | Иначе 267 | Вывести("Пропускаю загрузку класса " + ИмяКласса); 268 | 269 | КонецЕсли; 270 | КонецПроцедуры 271 | 272 | Процедура ДобавитьМодульЕслиРанееНеДобавляли(ПутьФайла, ИмяМодуля) 273 | Вывести("Добавляю модуль, если ранее не добавляли " + ИмяМодуля); 274 | 275 | МодульУжеЕсть = КэшМодулей.Найти(ИмяМодуля) <> Неопределено; 276 | Если Не МодульУжеЕсть Тогда 277 | 278 | Вывести("Добавляю модуль, т.к. он не найден - " + ИмяМодуля); 279 | ДобавитьМодуль(ПутьФайла, ИмяМодуля); 280 | КэшМодулей.Добавить(ИмяМодуля); 281 | Иначе 282 | Вывести("Пропускаю загрузку модуля " + ИмяМодуля); 283 | 284 | КонецЕсли; 285 | КонецПроцедуры 286 | 287 | Процедура Вывести(Знач Сообщение) 288 | Если ПоказатьСообщенияЗагрузки Тогда 289 | Сообщить(Сообщение); 290 | КонецЕсли; 291 | КонецПроцедуры 292 | 293 | Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию) 294 | Рез = ЗначениеПоУмолчанию; 295 | РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды); 296 | Если ЗначениеЗаполнено(РезИзСреды) Тогда 297 | РезИзСреды = СокрЛП(РезИзСреды); 298 | Попытка 299 | Рез = Число(РезИзСреды) <> 0 ; 300 | Исключение 301 | Рез = ЗначениеПоУмолчанию; 302 | Сообщить(СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2", ИмяПеременнойСреды, РезИзСреды)); 303 | КонецПопытки; 304 | КонецЕсли; 305 | 306 | Возврат Рез; 307 | КонецФункции 308 | 309 | // Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей, что помогает при анализе проблем 310 | // очень полезно при анализе ошибок загрузки 311 | // Переменная среды может принимать значение 0 (выключено) или 1 (включено) 312 | // Значение флага по умолчанию - Ложь 313 | ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды( 314 | "OSLIB_LOADER_TRACE", Ложь); 315 | 316 | // Если Ложь, то пропускаются ошибки повторной загрузки классов/модулей, 317 | //что важно при разработке/тестировании стандартных библиотек 318 | // Если Истина, то выдается ошибка при повторной загрузке классов библиотек из движка 319 | // Переменная среды может принимать значение 0 (выключено) или 1 (включено) 320 | // Значение флага по умолчанию - Истина 321 | ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей = ПолучитьБулевоИзПеременнойСреды( 322 | "OSLIB_LOADER_DUPLICATES", Ложь); 323 | 324 | // для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку 325 | // (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os) 326 | 327 | КэшМодулей = Новый Массив; 328 | -------------------------------------------------------------------------------- /oscript-sql/DBConnector.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine; 2 | 3 | using System; 4 | using ScriptEngine.Machine.Contexts; 5 | using OneScript.Contexts; 6 | using System.Data.SqlClient; 7 | using System.Data.Common; 8 | using System.Data; 9 | using System.Data.SQLite; 10 | using MySql.Data.MySqlClient; 11 | using Npgsql; 12 | 13 | namespace OScriptSql 14 | { 15 | /// 16 | /// Соединение с БД. Используется для указания источника данных объекта Запрос. 17 | /// 18 | [ContextClass("Соединение", "Connection")] 19 | public class DBConnector : AutoContext 20 | { 21 | private int _dbType; 22 | private int _port; 23 | private string _server; 24 | private string _dbName; 25 | private string _login; 26 | private string _password; 27 | private DbConnection _connection; 28 | private string _connectionString; 29 | private string _lastErrorMessage; 30 | 31 | /// 32 | /// Создает новый экземпляр класса Соединение 33 | /// 34 | public DBConnector() 35 | { 36 | _dbType = 0; 37 | _port = 0; 38 | _server = ""; 39 | _dbName = ""; 40 | _login = ""; 41 | _password = ""; 42 | _connectionString = ""; 43 | _lastErrorMessage = ""; 44 | _connection = null; 45 | } 46 | 47 | /// 48 | public override string ToString() 49 | { 50 | return "Соединение"; 51 | } 52 | 53 | 54 | /// 55 | /// Типы поддерживаемых СУБД 56 | /// 57 | /// ТипСУБД 58 | [ContextProperty("ТипыСУБД", "DBTypes")] 59 | public IValue DbTypes 60 | { 61 | get 62 | { 63 | var dtype = new EnumDBType(); 64 | return dtype; 65 | } 66 | } 67 | 68 | 69 | /// 70 | /// Тип подключенной СУБД 71 | /// 72 | /// ТипСУБД 73 | [ContextProperty("ТипСУБД", "DBType")] 74 | public int DbType 75 | { 76 | get 77 | { 78 | return _dbType; 79 | } 80 | 81 | set 82 | { 83 | _dbType = value; 84 | } 85 | } 86 | 87 | /// 88 | /// Порт подключения 89 | /// 90 | /// Число 91 | [ContextProperty("Порт", "Port")] 92 | public int Port 93 | { 94 | get 95 | { 96 | return _port; 97 | } 98 | 99 | set 100 | { 101 | _port = value; 102 | } 103 | } 104 | 105 | /// 106 | /// Имя или IP сервера 107 | /// 108 | /// Строка 109 | [ContextProperty("Сервер", "Server")] 110 | public string Server 111 | { 112 | get 113 | { 114 | return _server; 115 | } 116 | 117 | set 118 | { 119 | _server = value; 120 | } 121 | } 122 | 123 | /// 124 | /// Имя базы, в случае с SQLITE - путь к базе 125 | /// 126 | /// Строка 127 | [ContextProperty("ИмяБазы", "DbName")] 128 | public string DbName 129 | { 130 | get 131 | { 132 | return _dbName; 133 | } 134 | 135 | set 136 | { 137 | _dbName = value; 138 | } 139 | } 140 | 141 | /// 142 | /// Пользователь под которым происходит подключение. 143 | /// Если СУБД MS SQL и пользователь не указан - используется Windows авторизация. 144 | /// 145 | /// Строка 146 | [ContextProperty("ИмяПользователя", "Login")] 147 | public string Login 148 | { 149 | get 150 | { 151 | return _login; 152 | } 153 | 154 | set 155 | { 156 | _login = value; 157 | } 158 | } 159 | 160 | /// 161 | /// Пароль пользователя 162 | /// 163 | /// Строка 164 | [ContextProperty("Пароль", "Password")] 165 | public string Password 166 | { 167 | get 168 | { 169 | return _password; 170 | } 171 | 172 | set 173 | { 174 | _password = value; 175 | } 176 | } 177 | 178 | /// 179 | /// Статус соединения с БД 180 | /// 181 | /// Булево 182 | [ContextProperty("Открыто", "IsOpen")] 183 | public bool IsOpen 184 | { 185 | get 186 | { 187 | if ((_connection == null)) 188 | { 189 | return false; 190 | } 191 | 192 | switch (_connection.State) 193 | { 194 | case ConnectionState.Broken: return false; 195 | case ConnectionState.Closed: return false; 196 | case ConnectionState.Connecting: return false; 197 | default: return true; 198 | } 199 | 200 | } 201 | } 202 | 203 | /// 204 | /// Состояние соединения: 205 | /// 206 | /// - Closed - Закрыто. 207 | /// - Open - Открыто. 208 | /// - Connecting - Соединяется с источником. 209 | /// - Executing - Выполняет команду 210 | /// - Fetching - Получает данные 211 | /// - Broken - Соединение оборвано. 212 | /// 213 | [ContextProperty("Состояние", "State")] 214 | public string State 215 | { 216 | get 217 | { 218 | if ((_connection == null)) 219 | { 220 | return "Closed"; 221 | } 222 | return _connection.State.ToString(); 223 | } 224 | } 225 | 226 | /// 227 | /// Текст последней ошибки 228 | /// 229 | /// Строка 230 | [ContextProperty("ПоследнееСообщениеОбОшибке", "LastErrorMessage")] 231 | public string LastErrorMessage 232 | { 233 | get 234 | { 235 | return _lastErrorMessage; 236 | } 237 | } 238 | 239 | /// 240 | /// Соединение с БД 241 | /// 242 | public DbConnection Connection => _connection; 243 | 244 | /// 245 | /// Подготовленная строка соединения. В случае sqlite аналог ИмяБазы 246 | /// 247 | /// Строка 248 | [ContextProperty("СтрокаСоединения", "ConnectionString")] 249 | public string ConnectionString 250 | { 251 | get 252 | { 253 | return _connectionString; 254 | } 255 | 256 | set 257 | { 258 | _connectionString = value; 259 | } 260 | } 261 | 262 | /// 263 | /// Создать объект Соединение 264 | /// 265 | /// Соединение 266 | [ScriptConstructor] 267 | public static IRuntimeContextInstance Constructor() 268 | { 269 | return new DBConnector(); 270 | } 271 | 272 | /// 273 | /// Открыть соединение с БД 274 | /// 275 | /// Булево 276 | [ContextMethod("Открыть", "Open")] 277 | public bool Open() 278 | { 279 | if (DbType == (new EnumDBType()).Sqlite) 280 | { 281 | if (ConnectionString == string.Empty && DbName != string.Empty) 282 | ConnectionString = string.Format("Data Source={0};", DbName); 283 | 284 | _connection = new SQLiteConnection(ConnectionString); 285 | 286 | return OpenConnection(); 287 | } 288 | else if (DbType == (new EnumDBType()).MSSQLServer) 289 | { 290 | _connection = new SqlConnection(); 291 | 292 | if (ConnectionString != String.Empty) 293 | { 294 | _connection.ConnectionString = ConnectionString; 295 | } 296 | else 297 | { 298 | _connectionString = @"Data Source=" + Server; 299 | if (Port != 0) 300 | { 301 | _connectionString += "," + Port.ToString(); 302 | } 303 | _connectionString += "; Initial Catalog= " + DbName + ";"; 304 | 305 | if (Login != String.Empty) 306 | { 307 | _connectionString += "User ID = " + Login +";"; 308 | if (Password != String.Empty) 309 | { 310 | _connectionString += "Password = " + Password + ";"; 311 | } 312 | } 313 | else 314 | { 315 | _connectionString += "Integrated Security=True"; 316 | } 317 | 318 | _connection.ConnectionString = _connectionString; 319 | } 320 | 321 | return OpenConnection(); 322 | } 323 | else if (DbType == (new EnumDBType()).MySQL) 324 | { 325 | if (ConnectionString == String.Empty) 326 | { 327 | _connectionString = ""; 328 | _connectionString += "server=" + _server + ";"; 329 | _connectionString += "user=" + _login + ";"; 330 | _connectionString += (_password != String.Empty ? "password=" + _password + ";" : ""); 331 | _connectionString += (_dbName != String.Empty ? "database=" + _dbName + ";" : ""); 332 | _connectionString += (_port != 0 ? "port=" + _port.ToString() + ";" : ""); 333 | } 334 | _connection = new MySqlConnection(_connectionString); 335 | return OpenConnection(); 336 | } 337 | else if (DbType == (new EnumDBType()).PostgreSQL) 338 | { 339 | if (ConnectionString == String.Empty) 340 | { 341 | _connectionString = ""; 342 | _connectionString += "Host=" + _server + ";"; 343 | _connectionString += "Username=" + _login + ";"; 344 | _connectionString += (_password != String.Empty ? "Password=" + _password + ";" : ""); 345 | _connectionString += (_dbName != String.Empty ? "Database=" + _dbName + ";" : ""); 346 | _connectionString += (_port != 0 ? "port=" + _port.ToString() + ";" : ""); 347 | } 348 | _connection = new NpgsqlConnection(_connectionString); 349 | return OpenConnection(); 350 | } 351 | return false; 352 | } 353 | 354 | private bool OpenConnection() 355 | { 356 | try 357 | { 358 | _connection.Open(); 359 | _lastErrorMessage = ""; 360 | return true; 361 | } 362 | catch (Exception e) 363 | { 364 | _lastErrorMessage = e.Message; 365 | return false; 366 | } 367 | } 368 | 369 | /// 370 | /// Закрыть соединение с БД 371 | /// 372 | [ContextMethod("Закрыть", "Close")] 373 | public void Close() 374 | { 375 | _connection.Close(); 376 | _connection.ConnectionString = ""; 377 | _connection.Dispose(); 378 | _connection = null; 379 | } 380 | 381 | /// 382 | /// Создать запрос с установленным соединением 383 | /// 384 | /// Запрос - Запрос с установленным соединением 385 | [ContextMethod("СоздатьЗапрос", "CreateQuery")] 386 | public Query CreateQuery() 387 | { 388 | var query = new Query(); 389 | query.SetConnection(this); 390 | return query; 391 | } 392 | 393 | } 394 | } 395 | --------------------------------------------------------------------------------