~vbursian/research-assistant/intervers

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
101
102
103
////////////////////////////////////////////////////////////////////////////////
/*! @file Database.cpp Class sDatabase.
- Part of RANet - Research Assistant Net Library.
- Uses  Qt v.5  - http://qt.io/
- Copyright(C) 2013-2018, Viktor E. Bursian, St.Petersburg, Russia.
                          VBursian AT gmail DOT com
*///////////////////////////////////////////////////////////////////////////////
#include "Database.h"
#include "StringsAndQStrings.h"
#include <QCoreApplication>
#include <QThread>
#include "Log.h"
namespace RA {
//------------------------------------------------------------------------------
//---------------------------------------------------------------- sDatabase ---

sDatabase::~sDatabase ()
{
  DEBUG_LOG(Quitting,"sDatabase::~sDatabase");
  QString                     ConnectionName;
  if( BackgroundConnection ){
    RANet::Log.Put(sLog::Critical,"Quitting","sDatabase::~sDatabase:"
        "BackgroundConnection is not closed");
  }
  if( MainConnection ){
    ConnectionName = MainConnection->connectionName();
    DEBUG_LOG(NetOpen,FromQString(ConnectionName)+" -- closing");
    MainConnection->close();
    delete MainConnection;  MainConnection=NULL;
    QSqlDatabase::removeDatabase(ConnectionName);
  }
}


sDatabase::sDatabase (rcsDB_Link  link)
    :sDB_Link(link)
    ,MainConnection(NULL)
    ,BackgroundConnection(NULL)
{
}


sDatabase::sDatabase (rcsDatabase  other)
    :sDB_Link(other)
    ,MainConnection(NULL)
    ,BackgroundConnection(NULL)
{
}


sDBConnection  sDatabase::Connection (const QString &  name_suffix)
{
  psDBConnection              C;
  QString                     ConnectionName;
  if( QThread::currentThread() == QCoreApplication::instance()->thread() ){
    C = MainConnection;
    ConnectionName = Id.ToString() + URL() + "_" + name_suffix + "_main";
  }else{
    C = BackgroundConnection;
    ConnectionName = Id.ToString() + URL() + "_" + name_suffix + "_background";
  }
  if( ! C ){
    C = new sDBConnection();
    if( QThread::currentThread() == QCoreApplication::instance()->thread() ){
      MainConnection = C;
    }else{
      BackgroundConnection = C;
    }
    (*C) = QSqlDatabase::addDatabase(QtDriverName[Type],ConnectionName);
    C->setHostName(ToQString(Host));
    C->setPort(Port);
    C->setDatabaseName(ToQString(DBName));
    C->setUserName(ToQString(Login));
    //!@todo{SQL} if Password=="___" запросить и здесь поправить.
    C->setPassword(ToQString(Password));
    C->setConnectOptions(ToQString(ConnectOptions));
    DEBUG_LOG(NetOpen,FromQString(ConnectionName)+" -- opening...");
    C->open();
    IF_DEBUG(
      if( C->isOpen() )
        DEBUG_LOG(NetOpen,FromQString(ConnectionName)+" -- is open");
    )
  }
  return *C;
}


void  sDatabase::CloseBackgroundConnection ()
{
  QString                     ConnectionName;
  if( BackgroundConnection ){
    ConnectionName = BackgroundConnection->connectionName();
    DEBUG_LOG(NetOpen,FromQString(ConnectionName)+" -- closing");
    BackgroundConnection->close();
    delete BackgroundConnection;  BackgroundConnection=NULL;
    QSqlDatabase::removeDatabase(ConnectionName);
  }
}

//------------------------------------------------------------------------------
} //namespace RA