-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDatabaseExplorerDoc.h
171 lines (155 loc) · 6.07 KB
/
DatabaseExplorerDoc.h
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
// DatabaseExplorerDoc.h : interface of the CDatabaseExplorerDoc class
//
#pragma once
#include "ChildFrm.h"
#include "QueryPane.h"
#include "MessagePane.h"
#include "DatabasePane.h"
#include "DatabaseExt.h"
#include "SettingsStoreEx.h"
#include <vector>
#include <chrono>
class CDatabaseExplorerView;
class CDatabaseExplorerDoc : public CDocument
{
protected: // create from serialization only
CDatabaseExplorerDoc() noexcept;
DECLARE_DYNCREATE(CDatabaseExplorerDoc)
// Attributes
public:
inline CDatabaseExt* GetDB() { return m_pDB.get(); }
inline CRecordset* GetRecordset() const { return m_pRecordset.get(); }
BOOL GetDSNSource() const { return m_bDSNSource; }
void SetDSNSource(const BOOL bSet) { m_bDSNSource = bSet; }
BOOL IsLoggedPopulateList() const { return m_bLogPopulateList; }
DatabaseType GetDatabaseType() const { return m_DatabaseType; }
void SetDatabaseType(const DatabaseType type) { m_DatabaseType = type; }
CString GetPostgreDB() const { return m_sPostgreDB; }
void SetPostgreDB(const CString& sName) { m_sPostgreDB = sName; }
const CString DecodePostGreDatabase(const CString& sConnectionString) const;
BOOL GetMsSqlAuthenticationRequired() const { return m_bMsSqlAuthenticationRequired; }
void SetMsSqlAuthenticationRequired(const BOOL bSet) { m_bMsSqlAuthenticationRequired = bSet; }
CString GetLastSelect() const { return m_sLastSelect; }
void SetLastSelect(const CString& sSQL) { m_sLastSelect = sSQL; }
CString GetError() const { return m_sError; }
// Operations
public:
void SetConnectionString() const;
auto GetDSN() const -> std::pair<CString, CString>;
void SetDSN(const CString& sName);
std::vector<CString> GetSQLStatements(const CString& sText) const;
CQueryPane* GetQueryPane() const;
CMessagePane* GetMessagePane() const;
CDatabasePane* GetDatabasePane() const;
CString GetTimeAsString(const std::chrono::high_resolution_clock::time_point& point1,
const std::chrono::high_resolution_clock::time_point& point2) const;
CString InitDatabase();
BOOL PopulateListCtrl(CListCtrl& ListCtrl, const CString& sSQL);
BOOL IsSelect(CString sQuery) const;
BOOL IsTableOperation(CString sQuery) const;
BOOL IsDatabaseOperation(CString sQuery) const;
BOOL PopulateDatabasePanel(CTreeCtrl& tree);
void LogMessage(const CString& sMessage, const MessageType& type, CChildFrame* pChild = nullptr) const;
BOOL RunSQL(const CString sSQL) const;
long GetRecordCount(const CString& sSQL) const;
int GetDatabaseCount() const;
BOOL SaveListContentToCSV(CListCtrl& ListCtrl, const CString& sPathName);
void RestoreQueries(CQueryPane* pPane) const;
std::vector<CString> GetDocumentQueries() const;
BOOL HasHarmfulQueries(const std::vector<CString>& queries) const;
size_t GetRootCount(const CTreeCtrl& tree) const;
// Overrides
public:
virtual BOOL OnNewDocument();
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual void OnCloseDocument();
virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
virtual void InitializeSearchContent();
virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS
// Implementation
public:
virtual ~CDatabaseExplorerDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
mutable CString m_sError;
BOOL m_bDSNSource{ FALSE }; // user dsn
std::pair<CString, CString> m_DSN{}; // dsn name - dsn type
CString m_sPostgreDB{ _T("postgres") };
std::unique_ptr<CDatabaseExt> m_pDB{};
std::unique_ptr<CRecordset> m_pRecordset{};
DatabaseType m_DatabaseType{ DatabaseType::MSSQL };
BOOL m_bMsSqlAuthenticationRequired{ FALSE };
CString m_sLastSelect{};
protected:
size_t TokenizeString(const CString& sText, const CString& sToken, std::vector<CString>& result) const;
void PopulateHeader(CListCtrl& ListCtrl, CRecordset& recordset);
BOOL PopulateMSSQL(CTreeCtrl& tree);
BOOL PopulateOracle(CTreeCtrl& tree);
BOOL PopulateSQLite(CTreeCtrl& tree);
BOOL PopulateMySql(CTreeCtrl& tree);
BOOL PopulatePostgre(CTreeCtrl& tree);
CChildFrame* GetChildFrame() const;
CString PrepareSQLForCountAll(const CString& sSQL) const;
std::vector<CString> GetHeaderItems(CListCtrl& ListCtrl);
void WriteHeaderLine(CListCtrl& ListCtrl, CStdioFile& file, const CString& sSeparator);
void WriteListLines(CListCtrl& ListCtrl, CStdioFile& file, const CString& sSeparator);
CString GetText(CHeaderCtrl& header, int nItem) const;
CString GetOracleUserID(const BOOL bMakeUpper = FALSE) const;
std::pair<CString, CString> GetMsSqlAuthenticationCredential() const;
inline CString ConvertToCString(const CDBVariant& variant)
{
CString sRet;
switch (variant.m_dwType)
{
case DBVT_LONG:
sRet = std::to_string(variant.m_lVal).c_str();
break;
case DBVT_DOUBLE:
sRet = std::to_string(variant.m_dblVal).c_str();
break;
case DBVT_DATE:
{
COleDateTime date(variant.m_pdate->year, variant.m_pdate->month,
variant.m_pdate->day, variant.m_pdate->hour,
variant.m_pdate->minute, variant.m_pdate->second);
if (0 == variant.m_pdate->hour && 0 == variant.m_pdate->minute && 0 == variant.m_pdate->second)
sRet = date.Format(_T("%Y-%m-%d"));
else
sRet = date.Format(_T("%Y-%m-%d %H:%M:%S"));
}
break;
case DBVT_STRING:
sRet = variant.m_pstring->GetString();
break;
case DBVT_ASTRING:
sRet = variant.m_pstringA->GetString();
break;
case DBVT_WSTRING:
sRet = variant.m_pstringW->GetString();
break;
default:
break;
}
return sRet;
}
private:
BOOL m_bLogPopulateList{ TRUE };
private:
void GetQueries(CRichEditCtrl* pRichEdit, std::vector<CString>& queries) const;
std::vector<CString> GetQueries(const CString& sFile) const;
BOOL ContainHarmfulKeyword(const CString& sSQL) const;
// Generated message map functions
protected:
//{{AFX_MSG(CDatabaseExplorerDoc)
afx_msg void OnEditDatasource();
afx_msg void OnLogPopulateList();
afx_msg void OnUpdateEditLogpopulatelist(CCmdUI* pCmdUI);
afx_msg void OnEditDisconnect();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};