diff --git a/src/ExecQuery_SQLCMD.os b/src/ExecQuery_SQLCMD.os new file mode 100644 index 0000000..4ee68e0 --- /dev/null +++ b/src/ExecQuery_SQLCMD.os @@ -0,0 +1,125 @@ +#Использовать cmdline +#Использовать 1commands +#Использовать logos + +Перем фЛог; + +// Получить имя лога продукта +// +// Возвращаемое значение: +// Строка - имя лога продукта +// +Функция ИмяЛога() Экспорт + Возврат "oscript.app.ExecQuery_SQLCMD"; +КонецФункции + +Функция ПолучитьТекстИзФайла( Знач пИмяФайла ) + + файлОбмена = Новый Файл(пИмяФайла); + Данные = ""; + Если файлОбмена.Существует() Тогда + чтениеТекста = Новый ЧтениеТекста(пИмяФайла, КодировкаТекста.UTF8); + данные = чтениеТекста.Прочитать(); + чтениеТекста.Закрыть(); + Иначе + Возврат Ложь; + КонецЕсли; + возврат данные; +КонецФункции + +Функция ПолучитьПараметрыИзКоманднойСтроки( Знач пАргументы ) + + Парсер = Новый ПарсерАргументовКоманднойСтроки(); + + Парсер.ДобавитьПараметр("Команда"); + + Парсер.ДобавитьПараметр("Сервер"); + Парсер.ДобавитьПараметр("Пользователь"); + Парсер.ДобавитьПараметр("Пароль"); + Парсер.ДобавитьПараметр("ИмяБазы"); + Парсер.ДобавитьПараметр("ПутьКФайлу"); + + Параметры = Парсер.Разобрать(пАргументы); + + Если Не Параметры.Количество() = 6 Тогда + + Сообщить("Должно быть команда и 5 параметров."); + Сообщить( " backup Сервер Пользователь Пароль ИмяБазы ПутьКФайлуБекапа"); + Сообщить( " execQuery Сервер Пользователь Пароль ИмяБазы ПутьКФайлуСкрипта"); + + ЗавершитьРаботу(1); + + КонецЕсли; + + Возврат Параметры; + +КонецФункции + +Функция ПолучитьПараметрСТекстомЗапроса( Знач пПараметры ) + + Если ВРег( пПараметры["Команда"]) = ВРег("backup") Тогда + + шаблонЗапросБекапа = "BACKUP DATABASE [%1] TO DISK = N'%2' WITH NOFORMAT, INIT, NAME = N'%1 FULL Backup', SKIP, NOREWIND, NOUNLOAD,COMPRESSION, STATS = 10"; + текстЗапроса = СтрШаблон( шаблонЗапросБекапа, пПараметры["ИмяБазы"], пПараметры["ПутьКФайлу"]); + + параметрСТекстомЗапроса = "-Q""" + текстЗапроса + """"; + + ИначеЕсли ВРег( пПараметры["Команда"]) = ВРег("execQuery") Тогда + + текстЗапроса = ПолучитьТекстИзФайла( пПараметры["ПутьКФайлу"] ); + + Если текстЗапроса = Ложь Тогда + фЛог.Ошибка( "Не удалось прочитать текст запроса из " + пПараметры["ПутьКФайлу"] ); + ЗавершитьРаботу(1); + КонецЕсли; + + параметрСТекстомЗапроса = "-i """ + пПараметры["ПутьКФайлу"] + """"; + + Иначе + + фЛог.Ошибка( "Неизвестная команда " + пПараметры["Команда"] ); + фЛог.Ошибка( "Поддерживаются только команды backup и execQuery" ); + ЗавершитьРаботу(1) + + КонецЕсли; + + Возврат параметрСТекстомЗапроса; + +КонецФункции // ПолучитьТекстЗапроса( Знач пКоманда ) + +Процедура ВыполнитьКоманду(Знач пАргументы) + + параметры = ПолучитьПараметрыИзКоманднойСтроки( пАргументы ); + + командаЗапуска = Новый Команда; + + Если фЛог.Уровень() = УровниЛога.Отладка Тогда + + логКомандыЗапуска = Логирование.ПолучитьЛог(командаЗапуска.ИмяЛога()); + логКомандыЗапуска.УстановитьУровень(УровниЛога.Отладка); + + КонецЕсли; + + командаЗапуска.УстановитьКоманду("sqlcmd"); + командаЗапуска.ДобавитьПараметр("-S" + параметры["Сервер"]); + командаЗапуска.ДобавитьПараметр("-U" + параметры["Пользователь"]); + командаЗапуска.ДобавитьПараметр("-P" + параметры["Пароль"]); + командаЗапуска.ДобавитьПараметр( ПолучитьПараметрСТекстомЗапроса( параметры ) ); + + командаЗапуска.УстановитьИсполнениеЧерезКомандыСистемы( Ложь ); + + кодВозврата = командаЗапуска.Исполнить(); + + Если Не КодВозврата = 0 Тогда + фЛог.Ошибка("Код возврата: " + КодВозврата); + фЛог.Информация(командаЗапуска.ПолучитьВывод()); + КонецЕсли; + + фЛог.Информация(командаЗапуска.ПолучитьВывод()); + +КонецПроцедуры + +фЛог = Логирование.ПолучитьЛог(ИмяЛога()); +//фЛог.УстановитьУровень(УровниЛога.Предупреждение); +//фЛог.УстановитьУровень(УровниЛога.Отладка); +ВыполнитьКоманду(АргументыКоманднойСтроки); \ No newline at end of file