From 9a406c3cef1b0dc0863fa2583b0439377d19ab05 Mon Sep 17 00:00:00 2001 From: salexdv Date: Mon, 29 Jun 2020 20:43:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MySQL.epf | Bin 0 -> 9155 bytes README.md | 140 +++- src/MySQL/ObjectModule.bsl | 788 ++++++++++++++++++ src/MySQL/maps.txt | 1 + src/MySQL/renames.txt | 7 + .../und/02c0fdaf-dc46-418d-8473-8e8995a21409 | 291 +++++++ .../info | 1 + src/MySQL/und/copyinfo | 7 + src/MySQL/und/root | 1 + src/MySQL/und/version | 3 + src/MySQL/und/versions | 1 + 11 files changed, 1239 insertions(+), 1 deletion(-) create mode 100644 MySQL.epf create mode 100644 src/MySQL/ObjectModule.bsl create mode 100644 src/MySQL/maps.txt create mode 100644 src/MySQL/renames.txt create mode 100644 src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 create mode 100644 src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info create mode 100644 src/MySQL/und/copyinfo create mode 100644 src/MySQL/und/root create mode 100644 src/MySQL/und/version create mode 100644 src/MySQL/und/versions diff --git a/MySQL.epf b/MySQL.epf new file mode 100644 index 0000000000000000000000000000000000000000..bb7f22746b95a2e0bbfd30ccd2a68a501036d2c4 GIT binary patch literal 9155 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

l;vUM@ADX-`8T@Y4;=ek`)g6ypH)sj7z zk`lG2!9&G(o+nTzGg?|xIfW#rp>>$|V1P7cFykUg25Z@4A@{JeiWQ;@l))B{2IW<#Ui^GR+wy{Z)GNIUyYUtH~V zbC5Pp6T;hMr|A=cjE5YW#Zt1YY=0SC~E(oJdBH+&^PByZ^YODNKnj>KV;8HyRjNh6{`Cx;N2jud$f21(j!ztewsuO*t1aQSRHd7eu$O17bZW|9<3_34G#Op$XH`RGZF(%5b2 zPGF)*Q4(`rLoPw4&+1}M^JVo%Nd`XRY(c@EtgmOVTA{&V%c0vWvU&@}33?@c)msgy zw7jl7$`xdmGD35x4wytIv@m0pB*DTc=kx+P>)%hY+F;P>`>LFkqsCfid05>o8-N^| zoDe@nYB*EEa<7R4!YxYmmVyo9@mM%`=~VnolF+wK@_Vt0!f8h4mj{FWj-sA2-?{rp zRrM0SN-mb8;LVq5`P72mH77)k7ON0xp+FSsD#$y6IY#mPRKloqf@DPwRx>Y;(c}Hx zfVy3vMm>ebt9FD9{4BZ~md7sr5bT39t&F%V?p=o}E{l(JBlCv0{Y~#*C^yuLih5O2 zWjYmspH>*F|)jVLyW z(u@eNMUX(?>=|h)Eb*D^`11nx6(GAU0IJWJL^=kp|7I7^&uaOsc3eblwDO(O_~!c4kjXXt!#l ze-n4(F9q5cFzQ^JhH7Xh=p|VQ;^xH-T+87t?YvUfd=*$kO5THC;eH%iWtbVTJ6-LVe;^iBW zRbaEugE^ha3r`1Y=}mj7wIqiRGTirif^O~nH+qaM9jPa|b9P5#`4`H}k?BA**#}S< zHW-D$wH=|U_Ens?#={`>y$&w;!e*?+1TQF+s-cWSQX)$Qxl_@$0-R<;xP6PLFrj)>?m7FZAuJbKUvUuIgA_^8ggAjw6q5~&* z!eFKZ2tHqVOtd>m_YY}A1d`ex{Q)UkvO9<_mfmYAY!BhgW`VZPB~SY6;7*ulMY?rN zLh`C8LD>haF;qV$QiQR^7%BOL3)4SG677pzYsU2WteC}!o#D;{wGJjyDANVJPPPaq zdwpaI?LKWaTTl*&62q?6777j?)6SkhJ(a{*I4TX`ej@Grjc-4cehrrHzL{qB@lpDE z{S3{*)4|H|c3El!;nJJvWsF$a_q&nap(A0%;-U+hqxG{7D>w&29b#uXQawm5XjDAx zcOdLAHn*4$L9$zZu`S-gTyA*iG+i@u;^`9)tJT%_2GgCWWBh~0M!4q$?vax z&w52u$0wKxrMN1B@@%iY(%s??6N*!Io{+}G1qtyLm^<#An&Yn)1{Wt5*Uu8@FH@H* zj=nQkYJ2LJ;70K^?+XKgB;zpu0p`^rVWIBDGGtroz)Ed4@bJn$9*{EQ41;WP2a_p) zOQ%?%)B?IYZuzL9Vm&soxs)@dt*)iC2QMp+zGo?qoxZ(;V=g^ET6i}FD5QU|K>fVk zI)2bFH{8d}QLc8)hH)F=SddO%vTnp!ui@Que7~%}A(%vmk0_OWuZE!oZ%{fR3W@R* zd?H$eH>xDbhL}}EJi4L7mEgUO{EfQY2IXYekr56trr33WxDoj}L)%viX65tR-!fYAan6no<#(BOX=}7}{K2Azl)gpKqBPn-l7nFAw~ug!~_L&ws&#^RIdU zE9d{lVJ^^Iz9Ya1%3*d;7W*lGHeq4?w;1Dq@>gt5N|Z2=N&P=K`Ue5*Z}9kk_)q?K zj5+;^*Iy`OVP^TiqKrR=S6++-Rs1TBN8)C#x{ajI0c^RG14BX4Gf1a_txe8;vHRYq zymyE9>xE*1O8&t{ z&$DgdossahZFx3|!Lqmn>nLVNc$ma~6H4*kE;dxlN{-*Y-rT#ast=MjyX_*#y0|>1 zq*cL4GOtsnouAsBxi#xvCB+-}S(nNw+66N~3~!64u|&n^ChoHo+-J0ki6GX_@`@`4 Wd}u+ay>q;+*Sk#rEKvO)xBV|_uHYH~ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index b784766..82b9e13 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,140 @@ # mysql_1c -«Класс» для упрощения работы с MySQL из 1С. Позволяет просто выполнять любые виды запросов и получать данные в виде таблицы значений. +«Класс» для упрощения работы с MySQL из 1С в Windows. +Позволяет просто выполнять любые виды запросов и получать данные в виде таблицы значений. + +## Пример получения данных +```bsl +// Подключение к базе данных +ИмяODBC = "local_base"; +ИмяБазы = "base_name"; +ИмяПользователя = "base_name_user"; +Пароль = "*******"; + +MySQL = Обработки.MySQL.Создать(); +MySQL.Инициализация(ИмяODBC, ИмяБазы, ИмяПользователя, Пароль); + +Если НЕ MySQL.УстановитьСоединение(Ложь) Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +КонецЕсли; +// Получение таблицы значений и работа с ней +Запрос = +"SELECT order_id, +| order_date, +| order_summ, +| order_customer +|FROM tamble_orders +|WHERE order_loaded=""N"""; + +ТаблицаЗаказов = MySQL.ПолучитьТаблицуЗначенийПоЗапросу(Запрос); + +Если ТаблицаЗаказов = Неопределено Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +КонецЕсли; + +Если ТаблицаЗаказов.Количество() = 0 Тогда + Сообщить("На сайте нет новых заказов для загрузки."); +Иначе + Для Каждого СтрокаТЗ ИЗ ТаблицаЗаказов Цикл + НомерЗаказа = СтрокаТЗ.order_id; + Покупатель = СтрокаТЗ.order_customer; + КонецЦикла; +КонецЕсли; +``` + +## Пример записи данных +```bsl +// Добавление новых записей в таблицу базы MySQL +// Одиночная запись +// Соответствие со значениями полей для новой записи таблицы +Товар = Новый Соответствие(); +Товар["product_id"] = "158742"; +Товар["product_name"] = "1С Управление торговлей 10.3"; +Товар["product_price"] = 12000; + +// Построение запроса +MySQL.СоздатьЗапрос("INSERT", "table_products", Товар); +// Выполнение +Если НЕ MySQL.ВыполнитьЗапрос() Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +КонецЕсли; + +// Несколько записей +// Массив в который вставляются соответстия +НовыеТовары = Новый Массив(); + +Товар = Новый Соответствие(); +Товар["product_id"] = "158742"; +Товар["product_name"] = "1С Управление торговлей, редакция 10.3"; +Товар["product_price"] = 12000; +НовыеТовары.Добавить(Товар); + +Товар = Новый Соответствие(); +Товар["product_id"] = "158743"; +Товар["product_name"] = "1С Управление торговлей, редакция 11"; +Товар["product_price"] = 12500; +НовыеТовары.Добавить(Товар); + +MySQL.СоздатьЗапрос("INSERT", "table_products", НовыеТовары); +Если НЕ MySQL.ВыполнитьЗапрос() Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +КонецЕсли; +// Обновление полей записи +// Соответствие с новыми значениями полей +Товар = Новый Соответствие(); +Товар["product_price"] = 13000; +Товар["product_rest"] = 10; + +// В четвертом параметре можно указать условие, по которым осуществляется поиск записей для обновления +MySQL.СоздатьЗапрос("UPDATE", "table_products", Товар, "WHERE product_id='158742'"); +Если НЕ MySQL.ВыполнитьЗапрос() Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +Иначе + Сообщить("Обновлено товаров: " + MySQL.КоличествоИзменныхЗаписей); +КонецЕсли; +// Выполнение произвольного запроса +Запрос = "DELETE FROM table_products WHERE product_id='158742'"; + +Если НЕ MySQL.ВыполнитьЗапрос(Запрос) Тогда + Сообщить(MySQL.ОписаниеОшибки); + Возврат Ложь; +КонецЕсли; +``` + +Есть возможность разбить INSERT запрос с несколькими записями на подзапросы, чтобы не вставлять за раз много значений. Например, при добавлении в таблицу более 1000 записей, можно сделать это 10-ю запросами по 100 записей в каждом. Для этого достаточно вызвать код: + +```bsl +MySQL.ЭлементовВЗапросе = 100; +``` + +После этого все массивные INSERTы будут делаться по 100 записей за раз. +Полный текст запроса можно получить так: + +```bsl +MySQL.СоздатьЗапрос("INSERT", "table_products", НовыеТовары); +Сообщить(MySQL.ТекстЗапроса()); +``` + +В случае, когда прямой доступ к MySQL запрещен, можно воспользоваться ssh-туннелем. Для этого в обработке есть настройки для запуска Putty. + +```bsl +MySQL.ИспользоватьPutty = Истина; +MySQL.Putty = "c:\Program Files\PuTTY\putty.exe"; // Путь к программе Putty (Kitty) +MySQL.User_put = "ssh_user"; // Имя пользователя для установки ssh-соединения +MySQL.Pass_put = "******"; // Пароль +MySQL.Name_put = "session_name"; // Имя сохраненной сесии Putty с настройками соединения +``` + +### Основные методы: +* **Инициализация** - Первоначальная инициализация для сохранения параметров ODBC +* **ВыполнитьТестовоеПодключение** - Тестирование соединения +* **СоздатьЗапрос** - Создает INSERT/UPDATE/REPLACE/DELETE запросы на основе переданных параметров +* **ВыполнитьЗапрос** - Выполнение переданного или построенного запроса +* **ПолучитьТаблицуЗначенийПоЗапросу** - Выполняет запрос через Recordset и заполняет таблицу значений полученными данными +* **ПолучитьМассивЗначенийПоЗапросу** - Выполняет запрос через Recordset и заполняет массив значений полученными данными +* **ДобавитьЗапрос** - Добавляет текст запроса для выполнения в пакетном режиме +* **ЗакрытьСоединение** - Закрывает существующее подключение к базе MySQL \ No newline at end of file diff --git a/src/MySQL/ObjectModule.bsl b/src/MySQL/ObjectModule.bsl new file mode 100644 index 0000000..ffc9451 --- /dev/null +++ b/src/MySQL/ObjectModule.bsl @@ -0,0 +1,788 @@ +Перем мСоединение; +Перем мЗапись; +Перем мКоманда; +Перем мТекстЗапроса; +Перем мМассивЗначений; + +// Функция возвращает строку, используемую для подключения к базе MySQL +// +Функция ПолучитьСтрокуСоединения() + + СтрокаСоединения = "DSN=" + СокрЛП(ODBC) + ";"; + СтрокаСоединения = СтрокаСоединения + "Database=" + СокрЛП(DB) + ";"; + СтрокаСоединения = СтрокаСоединения + "Uid=" + СокрЛП(User) + ";"; + СтрокаСоединения = СтрокаСоединения + "Pwd=" + СокрЛП(Pass) + ";"; + + Возврат СтрокаСоединения; + +КонецФункции + +// Функцяи создает и возвращает подключение к базе MySQL +// +Функция УстановитьСоединение(ТестовоеПодключение = Ложь, ВыводитьОшибку = Истина) Экспорт + + ОписаниеОшибки = ""; + + ЗапуститьPuTTY(); + + мСоединение = Новый COMОбъект("ADODB.Connection"); + Попытка + мСоединение.Open(ПолучитьСтрокуСоединения()); + Исключение + ОписаниеОшибки = ОписаниеОшибки + ОписаниеОшибки() + Символы.ПС; + Если ВыводитьОшибку Тогда + Сообщить(ОписаниеОшибки); + КонецЕсли; + мСоединение = Неопределено; + КонецПопытки; + + Если НЕ ТестовоеПодключение Тогда + СоздатьОбработчикЗаписей(); + СоздатьОбработчикКоманд(); + КонецЕсли; + + Возврат (мСоединение <> Неопределено); + +КонецФункции + +// Процедура закрывает существующее подключение к базе MySQL +// +Процедура ЗакрытьСоединение() Экспорт + + ОписаниеОшибки = ""; + + Если мСоединение <> Неопределено Тогда + ЗакрытьОбработчикЗаписей(); + ЗакрытьОбработчикКоманд(); + мСоединение.Close(); + мСоединение = Неопределено; + КонецЕсли; + + ЗавершитьPuTTY(); + +КонецПроцедуры + +// Функция выполняет простые запросы (INSERT, DELETE, UPDATE) +// в базе MySQL +// +Функция ВыполнитьПростойЗапрос(ТекстЗапроса) + + КоличествоИзменныхЗаписей = 0; + + ОписаниеОшибки = ""; + + мКоманда.CommandText = ТекстЗапроса; + мКоманда.CommandType = 1; + + Попытка + мКоманда.Execute(КоличествоИзменныхЗаписей); + Исключение + ОписаниеОшибки = "Не удалось выполнить запрос: " + ОписаниеОшибки(); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +// Выполнение переданного или построенного запроса +// +Функция ВыполнитьЗапрос(ТекстЗапроса = Неопределено) Экспорт + + ОписаниеОшибки = ""; + + Если ТекстЗапроса = Неопределено Тогда + + Если мМассивЗначений.Количество() = 0 Тогда + + Возврат ВыполнитьПростойЗапрос(мТекстЗапроса); + + Иначе + + Для Каждого ЗначенияЗапроса ИЗ мМассивЗначений Цикл + + Если НЕ ВыполнитьПростойЗапрос(СтрЗаменить(мТекстЗапроса, "&VALUES", ЗначенияЗапроса)) Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + + КонецЕсли; + + Иначе + + Возврат ВыполнитьПростойЗапрос(ТекстЗапроса); + + КонецЕсли; + +КонецФункции + +// Возвращает список полей для запросов INSERT и REPLACE +// в формате Поле1,Поле2,ПолеN +// +Функция ПолучитьТекстПолейЗапроса(ЗначенияПолей) + + Текст = ""; + + Поля = ЗначенияПолей; + Если ТипЗнч(Поля) = Тип("Массив") Тогда + Поля = ЗначенияПолей[0]; + ИначеЕсли ТипЗнч(Поля) = Тип("ТаблицаЗначений") Тогда + Колонки = Новый Соответствие(); + Для Каждого Колонка ИЗ Поля.Колонки Цикл + Колонки[Колонка.Имя] = Истина; + КонецЦикла; + Поля = Колонки; + КонецЕсли; + + Для Каждого Обход ИЗ Поля Цикл + Текст = Текст + Обход.Ключ + ","; + КонецЦикла; + + Возврат Лев(Текст, СтрДлина(Текст) - 1); + +КонецФункции + +// Возвращает текст для UPDATE запроса с именами и значениями полей в виде +// ИмяПоля1=ЗначениеПоля1,ИмяПоля2=ЗначениеПоля2 +// +Функция ПолучитьТекстДляЗапросаОбновления(ЗначенияПолей) + + Текст = ""; + + НомерПоля = 0; + + Для Каждого Обход ИЗ ЗначенияПолей Цикл + + НомерПоля = НомерПоля + 1; + + Текст = Текст + Обход.Ключ + "='" + Обход.Значение + "'"; + + Если НомерПоля < ЗначенияПолей.Количество() Тогда + Текст = Текст + "," + Символы.ПС; + КонецЕсли; + + КонецЦикла; + + Возврат Текст; + +КонецФункции + +// Заполняет массив со значениями полей для запросов INSERT и REPLACE +// Массив хранит значения в виде (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN), +// (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN), (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN) +// В массив значения записываются в количестве ЭлементовВОдномЗапросе +// +Функция ПодготовитьЗначенияЗапроса(ЗначенияПолей, ЭлементовВОдномЗапросе) + + Значения = ЗначенияПолей; + + Если ТипЗнч(Значения) <> Тип("ТаблицаЗначений") Тогда + + Если ТипЗнч(Значения) = Тип("Соответствие") Тогда + Значения = Новый Массив(); + Значения.Добавить(ЗначенияПолей); + КонецЕсли; + + Текст = ""; + НомерЗначения = 0; + ВсегоЗначений = Значения.Количество(); + + Для Каждого Значение ИЗ Значения Цикл + + НомерЗначения = НомерЗначения + 1; + + Текст = Текст + "("; + + ТекстЗначений = ""; + Для Каждого Обход ИЗ Значение Цикл + ТекстЗначений = ТекстЗначений + "'" + Обход.Значение + "',"; + КонецЦикла; + + Текст = Текст + Лев(ТекстЗначений, СтрДлина(ТекстЗначений) - 1) + ")"; + + Если ЭлементовВОдномЗапросе > 0 И НомерЗначения % ЭлементовВОдномЗапросе = 0 Тогда + мМассивЗначений.Добавить(Текст); + Текст = ""; + КонецЕсли; + + Если НомерЗначения < ВсегоЗначений И ЗначениеЗаполнено(Текст) Тогда + Текст = Текст + "," + Символы.ПС; + КонецЕсли; + + КонецЦикла; + + Иначе + + Колонки = Новый Соответствие(); + + Для Каждого Колонка ИЗ Значения.Колонки Цикл + Колонки[Колонка.Имя] = Истина + КонецЦикла; + + Текст = ""; + НомерЗначения = 0; + ВсегоЗначений = Значения.Количество(); + + Для Каждого Значение ИЗ Значения Цикл + + НомерЗначения = НомерЗначения + 1; + + Текст = Текст + "("; + + ТекстЗначений = ""; + Для Каждого Колонка ИЗ Колонки Цикл + ТекстЗначений = ТекстЗначений + "'" + Значение[Колонка.Ключ] + "',"; + КонецЦикла; + + Текст = Текст + Лев(ТекстЗначений, СтрДлина(ТекстЗначений) - 1) + ")"; + + Если ЭлементовВОдномЗапросе > 0 И НомерЗначения % ЭлементовВОдномЗапросе = 0 Тогда + мМассивЗначений.Добавить(Текст); + Текст = ""; + КонецЕсли; + + Если НомерЗначения < ВсегоЗначений И ЗначениеЗаполнено(Текст) Тогда + Текст = Текст + "," + Символы.ПС; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Если ЗначениеЗаполнено(Текст) Тогда + мМассивЗначений.Добавить(Текст); + КонецЕсли; + +КонецФункции + +// Возвращает текст запроса, созданного функцией СоздатьЗапрос +// +Функция ТекстЗапроса() Экспорт + + Если мМассивЗначений.Количество() = 0 Тогда + + Возврат мТекстЗапроса; + + Иначе + + ТекстЗначений = ""; + НомерЗначения = 0; + + Для Каждого Значения ИЗ мМассивЗначений Цикл + + НомерЗначения = НомерЗначения + 1; + ТекстЗначений = ТекстЗначений + Значения; + + Если НомерЗначения < мМассивЗначений.Количество() Тогда + ТекстЗначений = ТекстЗначений + "," + Символы.ПС; + КонецЕсли; + + КонецЦикла; + + Возврат СтрЗаменить(мТекстЗапроса, "&VALUES", ТекстЗначений); + + КонецЕсли; + +КонецФункции + +// Создает текст запроса INSERT, REPLACE, UPDATE на основе переданных +// параметров +// +Функция СоздатьЗапрос(ТипЗапроса = "INSERT", ИмяТаблицы, ЗначенияПолей, Условие = "", ЭлементовВОдномЗапросе = 0) Экспорт + + ОписаниеОшибки = ""; + + мМассивЗначений = Новый Массив(); + + Если ЭлементовВОдномЗапросе = 0 Тогда + ЭлементовВОдномЗапросе = ЭлементовВЗапросе; + КонецЕсли; + + ТипЗапроса = СокрЛП(ВРЕГ(ТипЗапроса)); + ИмяТаблицы = СокрЛП(ИмяТаблицы); + + Если НЕ ЗначениеЗаполнено(ИмяТаблицы) Тогда + ОписаниеОшибки = "Не указано имя таблицы"; + Возврат Ложь; + КонецЕсли; + + Если ТипЗапроса <> "DELETE" Тогда + + Если НЕ ЗначениеЗаполнено(ЗначенияПолей) Тогда + ОписаниеОшибки = "Не заданы значения полей"; + Возврат Ложь; + КонецЕсли; + + Если ТипЗнч(ЗначенияПолей) <> Тип("Соответствие") + И ТипЗнч(ЗначенияПолей) <> Тип("Структура") + И ТипЗнч(ЗначенияПолей) <> Тип("Массив") + И ТипЗнч(ЗначенияПолей) <> Тип("ТаблицаЗначений") Тогда + ОписаниеОшибки = "Значения полей имеют неверный тип"; + Возврат Ложь; + КонецЕсли; + + Если ТипЗапроса = "UPDATE" И (ТипЗнч(ЗначенияПолей) <> Тип("Соответствие") И ТипЗнч(ЗначенияПолей) <> Тип("Структура")) Тогда + ОписаниеОшибки = "Для данного типа запроса в качестве значений полей можно передавать только соответствие или структуру"; + Возврат Ложь; + КонецЕсли; + + Если ЗначенияПолей.Количество() = 0 Тогда + ОписаниеОшибки = "Передан пустой список полей"; + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + Если ТипЗапроса = "INSERT" ИЛИ ТипЗапроса = "REPLACE" Тогда + + мТекстЗапроса = ТипЗапроса + " INTO " + ИмяТаблицы + Символы.ПС; + мТекстЗапроса = мТекстЗапроса + "(" + ПолучитьТекстПолейЗапроса(ЗначенияПолей) + ")" + Символы.ПС; + мТекстЗапроса = мТекстЗапроса + " VALUES &VALUES" + Символы.ПС; + + ПодготовитьЗначенияЗапроса(ЗначенияПолей, ЭлементовВОдномЗапросе); + + ИначеЕсли ТипЗапроса = "UPDATE" Тогда + + мТекстЗапроса = "UPDATE " + ИмяТаблицы + " SET " + Символы.ПС; + мТекстЗапроса = мТекстЗапроса + ПолучитьТекстДляЗапросаОбновления(ЗначенияПолей); + + ИначеЕсли ТипЗапроса = "DELETE" Тогда + + мТекстЗапроса = "DELETE FROM " + ИмяТаблицы; + + Иначе + + ОписаниеОшибки = "Неизвестный тип запроса"; + Возврат Ложь; + + КонецЕсли; + + Если ТипЗапроса = "UPDATE" ИЛИ ТипЗапроса = "DELETE" Тогда + + Если ЗначениеЗаполнено(Условие) Тогда + мТекстЗапроса = мТекстЗапроса + Символы.ПС + Условие; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Добавляет текст запроса для выполнения в пакетном режиме +// +Функция ДобавитьЗапрос(Запрос) Экспорт + + ТекстЗапроса = СокрЛП(Запрос); + + Если Прав(ТекстЗапроса, 1) <> ";" Тогда + ТекстЗапроса = ТекстЗапроса + ";"; + КонецЕсли; + + Если ЗначениеЗаполнено(мТекстЗапроса) Тогда + мТекстЗапроса = мТекстЗапроса + Символы.ПС; + КонецЕсли; + + мТекстЗапроса = мТекстЗапроса + ТекстЗапроса; + +КонецФункции + +// Функция выполняет запрос через Recordset и заполняет таблицу +// значений полученными данными +// +Функция ПолучитьТаблицуЗначенийПоЗапросу(ТекстЗапроса) Экспорт + + ОписаниеОшибки = ""; + + ТаблицаЗначений = Неопределено; + + Если мЗапись <> Неопределено Тогда + + Попытка + мЗапись.Open(ТекстЗапроса); + Исключение + ОписаниеОшибки = ОписаниеОшибки(); + Возврат Неопределено + КонецПопытки; + + ТаблицаЗначений = Новый ТаблицаЗначений(); + + ИменаПолей = Новый Массив(); + Для Каждого Field ИЗ мЗапись.Fields Цикл + ИменаПолей.Добавить(Field.Name); + ТаблицаЗначений.Колонки.Добавить(Field.Name); + КонецЦикла; + + Если мЗапись.EOF() И мЗапись.BOF() Тогда + // Нет записей в запросе + Иначе + + Попытка + + // Считываем информацию из выборки + мЗапись.MoveFirst(); + + Пока НЕ мЗапись.EOF() Цикл + + СтрокаТЗ = ТаблицаЗначений.Добавить(); + Для Каждого Поле ИЗ ИменаПолей Цикл + СтрокаТЗ[Поле] = мЗапись.Fields.Item(Поле).Value; + КонецЦикла; + + мЗапись.MoveNext(); + + КонецЦикла; + + Исключение + + ОписаниеОшибки = ОписаниеОшибки(); + ТаблицаЗначений = Неопределено + + КонецПопытки; + + КонецЕсли; + + ЗакрытьОбработчикЗаписей(); + + Иначе + + ОписаниеОшибки = "Невозможно выполнить запрос т.к. нет активного соединения"; + + КонецЕсли; + + Возврат ТаблицаЗначений; + +КонецФункции + +// Функция выполняет запрос через Recordset и заполняет массив +// значений полученными данными +// +Функция ПолучитьМассивЗначенийПоЗапросу(ТекстЗапроса, ИмяПоля = Неопределено) Экспорт + + ОписаниеОшибки = ""; + + МассивЗначений = Неопределено; + + Если мЗапись <> Неопределено Тогда + + Попытка + мЗапись.Open(ТекстЗапроса); + Исключение + ОписаниеОшибки = ОписаниеОшибки(); + Возврат Неопределено + КонецПопытки; + + МассивЗначений = Новый Массив(); + + Если мЗапись.EOF() И мЗапись.BOF() Тогда + // Нет записей в запросе + Иначе + + Попытка + + // Считываем информацию из выборки + мЗапись.MoveFirst(); + + Пока НЕ мЗапись.EOF() Цикл + Поле = ?(ИмяПоля = Неопределено, 0, ИмяПоля); + МассивЗначений.Добавить(мЗапись.Fields.Item(Поле).Value); + мЗапись.MoveNext(); + КонецЦикла; + + Исключение + + ОписаниеОшибки = ОписаниеОшибки(); + МассивЗначений = Неопределено + + КонецПопытки; + + КонецЕсли; + + ЗакрытьОбработчикЗаписей(); + + Иначе + + ОписаниеОшибки = "Невозможно выполнить запрос т.к. нет активного соединения"; + + КонецЕсли; + + Возврат МассивЗначений; + +КонецФункции + +Функция СоздатьЗаписьТаблицыПоСтруктуре(СтруктураДанных) Экспорт + + Ошибка = Ложь; + + ИмяТаблицы = Неопределено; + + СтруктураДанных.Свойство("ИмяТаблицы", ИмяТаблицы); + + Если ЗначениеЗаполнено(ИмяТаблицы) Тогда + + Record = New COMОбъект("ADODB.RecordSet"); + + Попытка + + Record.Open(ИмяТаблицы, мСоединение, 0, 4, 2); + Record.AddNew(); + + Для Каждого Обход ИЗ СтруктураДанных Цикл + + Если Обход.Ключ <> "ИмяТаблицы" Тогда + + ЗначениеПоля = Обход.Значение; + + Если ТипЗнч(ЗначениеПоля) = Тип("ДвоичныеДанные") Тогда + + ВремФайл = ПолучитьИмяВременногоФайла("bin"); + ЗначениеПоля.Записать(ВремФайл); + + Stream = Новый COMОбъект("ADODB.Stream"); + Stream.Type = 1; // Bynary data + Stream.Open(); + + Попытка + Stream.LoadFromFile(ВремФайл); + Исключение + Ошибка = Истина; + ОписаниеОшибки = "Не получить двоичные данные для записи:" + Символы.ПС + ОписаниеОшибки(); + КонецПопытки; + + Если НЕ Ошибка Тогда + Record.Fields(Обход.Ключ).Value = Stream.Read(); + Stream.Close(); + КонецЕсли; + + Stream = Неопределено; + + ИначеЕсли ТипЗнч(ЗначениеПоля) <> Тип("Число") Тогда + + Record.Fields(Обход.Ключ).Value = Строка(ЗначениеПоля); + + Иначе + + Record.Fields(Обход.Ключ).Value = ЗначениеПоля; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Record.UpdateBatch(); + Record.Close(); + + Исключение + + ОписаниеОшибки = ОписаниеОшибки(); + Ошибка = Истина; + + КонецПопытки; + + Иначе + + ОписаниеОшибки = "Не задано имя таблицы"; + Ошибка = Истина; + + КонецЕсли; + + Возврат НЕ Ошибка; + +КонецФункции + +// Функция выполняет проверку соединения с базой MySQL +// Возвращает Истина в случае успешного соединения +// Ложь - если соединение не было установлено +// +Функция ВыполнитьТестовоеПодключение(ВыводитьОшибку = Истина) Экспорт + + ОписаниеОшибки = ""; + + ПодключениеСоздано = УстановитьСоединение(ВыводитьОшибку); + + ЗакрытьСоединение(); + + Возврат ПодключениеСоздано; + +КонецФункции + +// Функция возвращает объект "ADODB.Recordset", +// связанный с текущим соединением +// +Функция ПолучитьОбработчикЗаписей() + + Если мСоединение <> Неопределено Тогда + Recordset = Новый COMОбъект("ADODB.Recordset"); + Recordset.ActiveConnection = мСоединение; + Возврат Recordset; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +// Создает глобальный объект "ADODB.Recordset", +// связанный с текущим соединением +// +Функция СоздатьОбработчикЗаписей() + + мЗапись = ПолучитьОбработчикЗаписей(); + +КонецФункции + +// Закрывает объект "ADODB.Recordset" +// +Функция ЗакрытьОбработчикЗаписей() + + Попытка + мЗапись.Close(); + Исключение + КонецПопытки; + +КонецФункции + +// Функция возвращает объект "ADODB.Command", +// связанный с текущим соединением +// +Функция ПолучитьОбработчикКоманд() + + Если мСоединение <> Неопределено Тогда + Command = Новый COMОбъект("ADODB.Command"); + Command.ActiveConnection = мСоединение; + Возврат Command; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +// Создает глобальный объект "ADODB.Command", +// связанный с текущим соединением +// +Функция СоздатьОбработчикКоманд() + + мКоманда = ПолучитьОбработчикКоманд(); + +КонецФункции + +// Закрывает объект "ADODB.Command" +// +Функция ЗакрытьОбработчикКоманд() + + мКоманда = Неопределено; + +КонецФункции + +// Проверка реквизитов перед подключением +// +Функция РеквизитыСоединенияЗаполнены() Экспорт + + ОписаниеОшибки = ""; + + Если НЕ ЗначениеЗаполнено(ODBC) Тогда + ОписаниеОшибки = "Не указано имя источника ODBC"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(DB) Тогда + ОписаниеОшибки = "Не указано имя базы данных"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(User) Тогда + ОписаниеОшибки = "Не указано имя пользователя"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Pass) Тогда + ОписаниеОшибки = "Не указан пароль пользователя"; + //Возврат Ложь; + КонецЕсли; + + Если ИспользоватьPutty Тогда + + Если НЕ ЗначениеЗаполнено(Putty) Тогда + ОписаниеОшибки = "Не указан путь к программе plink"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Name_put) Тогда + ОписаниеОшибки = "Не указано имя настройки PuTTY"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(User_put) Тогда + ОписаниеОшибки = "Не указано имя пользователя PuTTY"; + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Pass_put) Тогда + ОписаниеОшибки = "Не указано пароль пользователя PuTTY"; + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Запуск putty +// +Процедура ЗапуститьPuTTY() + + Если ИспользоватьPutty Тогда + + Если Задержка_put = 0 Тогда + Задержка_put = 5; + КонецЕсли; + + ЗапуститьПриложение(Putty + " -load " + Name_put + " -l " + User_put + " -pw " + Pass_put); + + ТекДата = ТекущаяДата(); + Пока ТекущаяДата() - ТекДата < Задержка_put Цикл + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +// Закрытие putty +// +Процедура ЗавершитьPuTTY() + + Если ИспользоватьPutty Тогда + ЗапуститьПриложение("taskkill /IM plink.exe"); + КонецЕсли; + +КонецПроцедуры + +// Установка параметров соединения +// +Процедура Инициализация(ИмяODBC, ИмяБазы, ИмяПользователя, Пароль) Экспорт + + ОписаниеОшибки = ""; + мМассивЗначений = Новый Массив(); + мТекстЗапроса = ""; + + ODBC = СокрЛП(ИмяODBC); + DB = СокрЛП(ИмяБазы); + User = СокрЛП(ИмяПользователя); + Pass = СокрЛП(Пароль); + +КонецПроцедуры + +// Очищает текст запроса +// +Процедура ОчиститьТекстЗапроса() Экспорт + + мТекстЗапроса = ""; + +КонецПроцедуры + +мМассивЗначений = Новый Массив(); +мТекстЗапроса = ""; \ No newline at end of file diff --git a/src/MySQL/maps.txt b/src/MySQL/maps.txt new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/src/MySQL/maps.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/MySQL/renames.txt b/src/MySQL/renames.txt new file mode 100644 index 0000000..f4331ad --- /dev/null +++ b/src/MySQL/renames.txt @@ -0,0 +1,7 @@ +02c0fdaf-dc46-418d-8473-8e8995a21409-->und\02c0fdaf-dc46-418d-8473-8e8995a21409 +2eca2134-e84c-47c6-92de-38ec8adca96e.0\info-->und\2eca2134-e84c-47c6-92de-38ec8adca96e.0\info +2eca2134-e84c-47c6-92de-38ec8adca96e.0\text-->ObjectModule.bsl +copyinfo-->und\copyinfo +root-->und\root +version-->und\version +versions-->und\versions diff --git a/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 b/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 new file mode 100644 index 0000000..c1e4c93 --- /dev/null +++ b/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 @@ -0,0 +1,291 @@ +{1, +{02c0fdaf-dc46-418d-8473-8e8995a21409},1, +{c3831ec8-d8d5-4f93-8a22-f9bfae07327f, +{1, +{4,0bc46fda-064b-4d30-bb35-46e4b6be1a28,b65468d6-edc4-46e8-b3ee-6c6ce4221770, +{0, +{0, +{0,0,2eca2134-e84c-47c6-92de-38ec8adca96e},"MySQL", +{1,"ru","My SQL"},""} +},00000000-0000-0000-0000-000000000000,"",00000000-0000-0000-0000-000000000000},4, +{2bcef0d1-0981-11d6-b9b8-0050bae0a95d,0}, +{3daea016-69b7-4ed4-9453-127911372fe6,0}, +{d5b0e5ed-256d-401c-9c36-f630cafd8a62,0}, +{ec6bb5e5-b7a8-4d75-bec9-658107a699cf,13, +{ +{0, +{25, +{2, +{0, +{0,0,855bf9d9-26d1-4750-a3da-8afdcbaa7ba7},"ODBC", +{1,"ru","Имя источника ODBC"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,9dd26e26-d7b6-4e39-b6ea-2eed8fae714c},"DB", +{1,"ru","Имя базы данных"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,2c2e9942-3321-4f7b-b41c-a41ba5a98625},"User", +{1,"ru","Имя пользователя"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,812f3e70-5004-4381-8cd6-e2ccf8b5055f},"Pass", +{1,"ru","Пароль"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,9c17d9a4-bc82-4b93-9559-0e469aafe164},"Putty", +{1,"ru","Putty"},""}, +{"Pattern", +{"S"} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,146e43ce-eeb5-444b-9620-ea958d51586a},"User_put", +{1,"ru","User put"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,73a436cc-79f9-448d-a065-cda2a4858f9c},"Pass_put", +{1,"ru","Pass put"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,8d1272f7-8edc-461a-af40-5ea882808d9a},"ИспользоватьPutty", +{1,"ru","Использовать putty"},""}, +{"Pattern", +{"B"} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,07471886-c2ce-4419-a477-990425a9c0b5},"Name_put", +{1,"ru","Name put"},""}, +{"Pattern", +{"S",50,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,e60689c5-c914-4047-8742-e3a9cb75ea21},"Задержка_put", +{1,"ru","Задержка put"},""}, +{"Pattern", +{"N",2,0,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,5ae1319d-4b65-4e9a-b293-117937b409bd},"ОписаниеОшибки", +{1,"ru","Описание ошибки"},""}, +{"Pattern", +{"S"} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,f3fbe5ab-e349-4420-acff-092e9a54cee7},"ЭлементовВЗапросе", +{1,"ru","Элементов в запросе"},""}, +{"Pattern", +{"N",5,0,1} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0}, +{ +{0, +{25, +{2, +{0, +{0,0,6c552ca2-6b18-4c1b-800e-c99171053e7f},"КоличествоИзменныхЗаписей", +{1,"ru","Количество изменных записей"},""}, +{"Pattern", +{"N",10,0,0} +} +},0, +{0}, +{0},0,"",0, +{"U"}, +{"U"},0,00000000-0000-0000-0000-000000000000,2,0, +{5004,0}, +{3,0,0}, +{0,0},0, +{0}, +{"S",""},0} +},0} +} +} +} +} \ No newline at end of file diff --git a/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info b/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info new file mode 100644 index 0000000..c70b5f3 --- /dev/null +++ b/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info @@ -0,0 +1 @@ +{3,1,0,"",0} \ No newline at end of file diff --git a/src/MySQL/und/copyinfo b/src/MySQL/und/copyinfo new file mode 100644 index 0000000..08913bc --- /dev/null +++ b/src/MySQL/und/copyinfo @@ -0,0 +1,7 @@ +{4, +{0}, +{0}, +{0}, +{0,0}, +{0} +} \ No newline at end of file diff --git a/src/MySQL/und/root b/src/MySQL/und/root new file mode 100644 index 0000000..ea199b9 --- /dev/null +++ b/src/MySQL/und/root @@ -0,0 +1 @@ +{2,02c0fdaf-dc46-418d-8473-8e8995a21409,} \ No newline at end of file diff --git a/src/MySQL/und/version b/src/MySQL/und/version new file mode 100644 index 0000000..c23bfe2 --- /dev/null +++ b/src/MySQL/und/version @@ -0,0 +1,3 @@ +{ +{216,0} +} \ No newline at end of file diff --git a/src/MySQL/und/versions b/src/MySQL/und/versions new file mode 100644 index 0000000..62a26d3 --- /dev/null +++ b/src/MySQL/und/versions @@ -0,0 +1 @@ +{1,7,"02c0fdaf-dc46-418d-8473-8e8995a21409",fd5ec58e-6ca0-42d7-aed4-eadabcda8925,"root",90379935-d3b5-40a1-b764-747314843385,"",0af3b619-528c-481e-80a5-9e023d7bec2c,"2eca2134-e84c-47c6-92de-38ec8adca96e.0",55e4eecd-b131-4425-a54c-0fc46f459fe0,"copyinfo",3470c372-75a6-484c-a87a-7ee754d5abb0,"versions",efeb2d2b-9c26-406c-bc34-344e9887c4cc,"version",b11151a7-b255-497f-a7ba-68694effec0c} \ No newline at end of file