gifts2017

Определение версии MySQL ODBC Connector

Опубликовал Андрей Хорошев (spawn_a) в раздел Программирование - Практика программирования

Автоматическое определение установленной версии ODBC Connector MySQL из реестра Windows

При написании фоновых заданий на сервере x64 частенько сталкивался с тем, что трудно каждый раз подбирать название строки драйвера для MySQL, в результате родился вот такой незамысловатый кусочек кода:

    Список=ПолучитьСписокУстановленныхODBC();
    СтрокаДрайверов=СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Список);
    СтрокаДрайвера=Неопределено;
    Если не Найти(нрег(СтрокаДрайверов), "mysql") Тогда
        //Нет драйвера, устанавливаем на клиенте
        #Если Клиент Тогда
        ВерсияWin=WindowsInfo();
        МакетКомпоненты=ПолучитьМакет("mySql"+Лев(ВерсияWin,3));
        ИмяФайлаУстановки=КаталогВременныхФайлов()+"driverMySQL.exe";
        МакетКомпоненты.Записать(ИмяФайлаУстановки);
        КомандаСистемы(ИмяФайлаУстановки);
        Сообщить("Пытаемся установить драйвер MySQL",СтатусСообщения.Важное);
        #Иначе
        ВызватьИсключение "На севере не установлен драйвер MySQL";
        #КонецЕсли
    Иначе
        МассивДрайверов=Новый СписокЗначений;
        МассивДрайверов.ЗагрузитьЗначения(Список);
        //Сортируем для использования старшей версии драйвера, если их установлено несколько
        МассивДрайверов.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
        Для Каждого СтрДрайвер из МассивДрайверов Цикл
            Если Найти(нрег(СтрДрайвер.Значение), "mysql") Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

Функцию ПолучитьСтрокуИзМассиваПодстрок можно взять из БСП. При работе на клиенте, при отсутсвии драйвера, будем ставить его автоматически из макета. Макет создаем из скачанного exe или msi файла с официального сайта. Для корректной установки на сервере, соответсвенно запускаем клиента с сервера, где выполняются фоновые задания 1С.

Далее обычное создание объекта:

    Соединение=Новый COMОбъект("ADODB.Connection");
    Порт = ?(ЗначениеЗаполнено(СтруктураПараметровСайта.Порт), СтруктураПараметровСайта.Порт, 3306);
    СтрокаСоединения= "
        |DRIVER={"+СокрЛП(СтрДрайвер)+"};
        |SERVER="+Сервер+";
        |DATABASE="+ИмяБазы+";
        |UID="+ИмяПользователя+";
        |PWD="+Пароль+"";

Собственно функция чтения установленных драйверов из реестра, для этого используем WMI:

Функция ПолучитьСписокУстановленныхODBC()

    Перем ODBCDrivers,Значения;
    
    WinMGMT = ПолучитьCOMОбъект("winmgmts:\\.\root\default:StdRegProv");
    HKLM = 2147483650;
    HKPath= "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers\";
    WinMGMT.EnumValues(HKLM, HKPath, ODBCDrivers, Значения);
    Рез=Новый Массив;
    Для Каждого Драйвер из ODBCDrivers Цикл
        Рез.Добавить(Драйвер);
    КонецЦикла;
    Возврат Рез;

КонецФункции
Ну и элементарное определение через MSScriptControl версии windows, из-под которой мы работаем:
Функция WindowsInfo()
    
    ScrptCtrl=Новый COMОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language="vbscript";
    ScrptCtrl.AddCode("
    |Function GetOSVersion()
    |    strInfo=vbNullString
    |    For Each objOStype in GetObject(""winmgmts:"").InstancesOf (""Win32_ComputerSystem"")
    |       'WScript.Echo ""PC type = "" & objOStype.SystemType
    |       strInfo = strInfo & objOStype.SystemType & vbCrLf
    |    Next
    |    
    |    GetOSVersion=strInfo
    |End Function
    |");
    Возврат ScrptCtrl.Run("GetOSVersion");
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Ийон Тихий (cool.vlad4) 01.02.16 20:55
Версию винды ЕМНИП через Новый СистемнаяИнформация (ВерсияОС , ТипПлатформы) можно получить.
2. Андрей Хорошев (spawn_a) 02.02.16 09:30
(1) cool.vlad4, Да всё верно, но в клиентском контексте это будет x32. В серверном будет - x64. Но если разные сервера для клиентского сеанса и фоновых заданий, то опять таки не то. Плюс сервер обслуживающий клиентов, вообще может под линухом крутиться.
cool.vlad4; +1 Ответить