Написано: 07.10.2018

Описание программы Connector.exe

Connector представляет собой несложную утилиту, простое консольное приложение, которое используется для проверки соединения с нужной базой данных Oracle.

Необходимость в подобной утилите возникает время от времени при возможных проблемах доступа в ту или иную среду (тестовую, среду разработки или продуктивную).

Конечно, выполнить подключение в БД несложно при использовании программ типа SQL Navigator или SQL Developer. (Небольшое затруднение состоит в том, что при наличии большого количества схем, с которыми приходиться иметь дело, где-то нужно еще хранить информацию о параметрах подключения).

Поэтому мною была написана несложная утилита для проверки подключения.

Программа работает с конфигурационным файлом, из которого считываются параметры подключения.

Конфигурационный файл – это обычный текстовый файл, в котором можно собрать параметры подключения ко всем нужным средам.

Пример конфигурационного файла.

[Dirs]
Tmp=Tmp
Log=Log

; При наличии в файле нескольких секций с одинаковым именем принимаются параметры той секции,
; которая расположена выше. Поэтому, для того, чтобы просто изменить параметры коннекта, 
; достаточно перенести нужную секцию [DB] наверх (используя copy/past)

; Параметр может использоваться в закодированном виде. 
; Признак наличия кодирования определяется по префиксу {CODE}
; Через двоеточие в префиксе {CODE} может быть задан способ кодирования
; Валидные значения способа кодирования INTEXP, RAPL, CALLEX
; INTEXP и RAPL - синонимы.
; По умолчанию используется INTEXP.

[DB]																; RAPL prod, via client
UseOraClient=yes
UserName=rapl
Password={CODE}2689854434440530446/22100
TnsName=ICT6GT.SOVINTEL.NET
; ok, 06/10/2017

[DB]																; RAPL prod, direct
UseOraClient=no
UserName=rapl
Password={CODE}2689854434440530446/22100
Server=ics6gt.vimpelcom.ru
SID=ICT6GT
; ok, 06/10/2017

Программа считывает параметы первой секции [DB] и далее выполняет попытку соединения к схеме и серверу, которые были в ней указаны.

О результатах соединения сообщается в текстовом журнале (он формируется в каталоге LOG с именем вида Connector_YYYY_MM_DD_HH_MI_SS.log).

Ниже приведен пример журнала.

Пример журнала

В случае неудачного подключения текст сообщения в журнале будет, разумеется, иным.

Проект Connector.bpr

Для реализации данного несложного проекта была использована интергированная среда разработки Borland C++ Builder (v.6.0)

Проект Connector

Для доступа к БД Oracle использовался компонент ODAC (в данном случае версии 6.9)

Файл SL_main.cpp

#include <vcl.h>
#include "USL.h"
#include "stdio.h"

namespace sln = SL_Names;

sln::TSL *sln::SL;

#pragma argsused
int main(int argc, char* argv[])
{

    sln::SL = new sln::TSL(argc, argv);
    sln::SL->Init();
    sln::SL->Run();

    delete sln::SL;

    return 0;
}

В файле сначала конструируется объект класса TSL (представляющий собой программу), затем происходит инициализация (метод Init), вызов кода выполнения (метод Run). По завершении объект-программа удаляется.

Фрагмент файла USL.h

#ifndef USLH
#define USLH

#include "vcl.h"
#include "Ora.hpp"
#include "SyncObjs.hpp"
#include "USL_Cfg.h"
#include "UAL_Log.h"
#include "UAL_Prg.h"

namespace AL = AL_Names;

namespace SL_Names {

class TSL : public AL::TAL_Prg {
    ...
public:
    __fastcall TSL(int argc, char** argv);
    virtual __fastcall ~TSL(void);
    void __fastcall Run(void);
	...
};

extern TSL *SL;

};

#endif

Фрагмент файла USL.cpp. Процедура выполненения Run()

/* Процедура выполнения
*/
void __fastcall TSL::Run(void)
{
    printf("%s: SIMPLE\n", FileName.c_str());
    printf("Writing to log %s\n", FLogName.c_str());

    if(FDoBasic == true) {
        DoBasicStart();
        DoBasic();
        DoBasicEnd();
    }

    printf("Thanks\n");
}

Как видно, здесь осуществляется вызов процедуры DoBasic(), в которой и сосредоточен весь полезный код по проверке соединения с БД.

Процедура DoBasic()

void __fastcall TSL::DoBasic(void)
{
    MsgLog = "Выполняется соединение к серверу БД Oracle...";
    MsgLog = "Применяются параметры конфигурационного файла (секция [DB]).";

    if(FCfg->DbUseOraClient == true) {
        MsgLog = "Используется ora-клиент.";
        MsgLog = Format("Строка коннекта конструируется как: %s\/%s@%s", ARRAYOFCONST((
            "UserName", "Password", "TnsName"
        )));
        MsgLog = "Значения параметров:";
        MsgLog = Format("UserName=%s", ARRAYOFCONST((FCfg->DbUserName)));
        MsgLog = Format("Password=%s", ARRAYOFCONST((FCfg->DbPassword)));
        MsgLog = Format("TnsName=%s", ARRAYOFCONST((FCfg->DbTnsName)));
        MsgLog = Format("Строка коннекта: %s\/%s@%s", ARRAYOFCONST((
            ValidCfg(FCfg->DbUserName, "UserName")
            , ValidCfg(FCfg->DbPassword, "Password")
            , ValidCfg(FCfg->DbTnsName, "TnsName")
        )));
    } else {
        MsgLog = "Ora-клиент не используется.";
        MsgLog = Format("Строка коннекта конструируется как: %s\/%s@%s:%s:%s", ARRAYOFCONST((
            "UserName", "Password", "Server", "Port", "SID"
        )));
        MsgLog = "Значения параметров:";
        MsgLog = Format("UserName=%s", ARRAYOFCONST((FCfg->DbUserName)));
        MsgLog = Format("Password=%s", ARRAYOFCONST((FCfg->DbPassword)));
        MsgLog = Format("Server=%s", ARRAYOFCONST((FCfg->DbServer)));
        MsgLog = Format("Port=%s", ARRAYOFCONST((FCfg->DbPort)));
        MsgLog = Format("SID=%s", ARRAYOFCONST((FCfg->DbSID)));
        MsgLog = Format("Строка коннекта: %s\/%s@%s:%s:%s", ARRAYOFCONST((
            ValidCfg(FCfg->DbUserName, "UserName")
            , ValidCfg(FCfg->DbPassword, "Password")
            , ValidCfg(FCfg->DbServer, "Server")
            , ValidCfg(FCfg->DbPort, "Port")
            , ValidCfg(FCfg->DbSID, "SID")
        )));
    }

    try {
        if(FOra->Connected == true) {
            FOra->Disconnect();
        }
        FOra->Options->Net = FDbNet;
        FOra->ConnectString = FDbConnectString;
        FOra->Connected = false;
        FOra->Connected = true;
    } catch (Exception &e) {
        AnsiString S;
        S = Format("ERR: неудачное соединение: %s", ARRAYOFCONST((e.Message)));
        MsgLog = S;
        return;
    }

    MsgLog = "Успешное соединение!";
}

В процедуре на основании сформированных параметров происходит формирование строк-сообщений в файл журнала (с помощью свойства MsgLog). Затем используется объект FOra для организации коннекции к нужной базе. В случае соединения формируется строка. Объект FOra представляет собой экземпляр класса TOraSession (библиотека ODAC).