Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cODBCEnv.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cODBCEnv_H
7 #define _INC_cODBCEnv_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cODBC.h"
13 #include "Sql/ISQLDriver.h"
14 #include "Sql/cSQLCmd.h"
15 
16 #ifdef USE_SQL
17 
18 #include <odbcinst.h> // SQLGetInstalledDrivers. SQL_SUCCESS
19 #include <sqltypes.h> // use SQLRETURN, SQLSMALLINT, SQLHANDLE, SQL_HANDLE_DBC
20 
21 namespace GrayLib
22 {
24  {
27  typedef cRefBase SUPER_t;
28 
29  public:
30  const SQLSMALLINT m_nSQLHandleType;
31 
32  SQLHANDLE m_hSQL;
33  SQLRETURN m_nSQLRet;
34 
35  public:
36  cODBCBase(SQLSMALLINT nSQLHandleType, cODBCBase* pParent);
37  virtual ~cODBCBase();
38 
39  inline bool isSQLRetOK2() const noexcept
40  {
41  return m_nSQLRet == SQL_SUCCESS || m_nSQLRet == SQL_SUCCESS_WITH_INFO ;
42  }
43 
44  virtual bool SetSQLAttr(long nAttribute, void* pValue) = 0;
45 
46  virtual HRESULT FillException(cSQLException* pException = nullptr);
47 
49 
50 #define cODBCBase_DISAMBIG virtual HRESULT FillException(cSQLException* pException=nullptr) override { return SUPER_t::FillException(pException); }
51 
52  };
53 
54  //***********************************************************
55 
57  {
60  typedef cODBCBase SUPER_t;
61  friend class cODBCDatabase;
62 
63  private:
64  cStringF m_sCommand;
65 
66  public:
67  cODBCStatement(cODBCBase* pParent, const cSQLCmd& oCmd)
68  : cODBCBase(SQL_HANDLE_STMT, pParent)
69  , m_sCommand(oCmd.get_Command())
70  {
71  // use SQLPrepare ??
72  }
73 
74  virtual bool SetSQLAttr(long nAttribute, void* pValue) override;
75 
76  virtual HRESULT CloseStatement(bool bDrop) override;
77 
78  virtual HRESULT ExecuteAndFetch(bool bResultsExpected) override;
79 
80  virtual void ExecCancel() override;
81 
82  virtual HRESULT FetchNext(bool bMore = false) override;
83 
84  virtual ITERATE_t ReadColumnCount() override;
85 
86  virtual bool ReadColumnInfo(SQL_COLUMN_t iColumn, OUT cSQLColumnInfo& info) override;
87 
88  void GetData_Raw(SQL_COLUMN_t iColumn, SQL_TYPE_t nType, OUT void* pBuffer, size_t nSizeBuffer, OUT INT_PTR* pnSizeRet);
89 
90  bool GetColumnVarNumber(SQL_COLUMN_t iColumn, cSQLColumnInfo* pColInfo, OUT cVariant& vValRet, SQL_TYPE_t nCType);
91 
92  bool GetColumnVarTime(SQL_COLUMN_t iColumn, OUT cVariant& vValRet);
93 
94  bool GetColumnVarText(SQL_COLUMN_t iColumn, OUT cVariant& vValRet);
95 
96  bool GetColumnVarBlob(SQL_COLUMN_t iColumn, cSQLColumnInfo* pColInfo, OUT cVariant& vValRet);
97 
98  static SQL_TYPE_t GRAYCALL UpdateColType(cSQLColumnInfo* pColInfo);
99 
100  virtual bool GetColumnVar(SQL_COLUMN_t iColumn, cSQLColumnInfo* pColInfo, OUT cVariant& vValRet);
101 
104  };
105 
106  //***********************************************************
107 
109  {
112  typedef cODBCBase SUPER_t;
113  public:
114  cODBCDatabase(cODBCBase* pParent) : cODBCBase(SQL_HANDLE_DBC, pParent)
115  {
116  }
117 
118  virtual bool SetSQLAttr(long nAttribute, void* pValue) override;
119 
120  virtual HRESULT OpenConnect(const cSQLConnectionString& rConnectionString, INT_PTR hParentWnd) override;
121 
122  bool GetInfo(SQLUSMALLINT nInfoType, void* pValue, OUT SQLSMALLINT* pnValueLength);
123 
124  bool GetInfoStr(SQLUSMALLINT nInfoType, OUT cStringA& sVal)
125  {
128 
129  FILECHAR_t szBuffer[StrT::k_LEN_MAX];
130  SQLSMALLINT nStringLength = STRMAX(szBuffer);
131 
132  if (!GetInfo(nInfoType, szBuffer, &nStringLength))
133  {
134  sVal.Empty();
135  return false;
136  }
137 
138  szBuffer[STRMAX(szBuffer)] = '\0'; // just in case
139  sVal = (char*)szBuffer;
140  return true;
141  }
142 
143  virtual HRESULT ReadConfigDB(OUT cSQLConfigDB& cfg) override;
144 
145  virtual bool Disconnect() override;
146 
147  virtual HRESULT EndTransaction(bool bCommit) override;
148 
149  virtual ISQLStatement* AllocISQLStatement(const cSQLCmd& oCmd) override
150  {
152  return new cODBCStatement(this, oCmd);
153  }
154 
157  };
158 
159  //***********************************************************
160 
161  class GRAYLIB_LINK cODBCEnv : public cODBCBase, public cSingleton<cODBCEnv>, public ISQLDriver
162  {
167 
168  typedef cODBCBase SUPER_t;
170 
171  public:
172  cODBCEnv();
173 
174  virtual bool SetSQLAttr(long nAttribute, void* pValue) override;
175 
176  virtual ISQLDatabase* AllocISQLDatabase(const cSQLConnectionString& rConnectionString) override
177  {
179  UNREFERENCED_REFERENCE(rConnectionString); // don't need this now. use it later.
180  return new cODBCDatabase(this);
181  }
182 
183  cArrayString<FILECHAR_t> GetInstalledDrivers();
184 
187  };
188 }
189 #endif
190 #endif
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define STRMAX(x)
Get Max size of static string space. minus the '\0' terminator character.
Definition: StrConst.h:33
#define UNREFERENCED_REFERENCE(x)
Definition: SysTypes.h:318
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define CHEAPOBJECT_IMPL
Definition: cHeapObject.h:32
#define cODBCBase_DISAMBIG
Definition: cODBCEnv.h:50
Definition: cODBCEnv.h:24
virtual bool SetSQLAttr(long nAttribute, void *pValue)=0
IUNKNOWN_DISAMBIG(SUPER_t)
SQLRETURN m_nSQLRet
SQL_SUCCESS.
Definition: cODBCEnv.h:33
bool isSQLRetOK2() const noexcept
Definition: cODBCEnv.h:39
SQLHANDLE m_hSQL
void* SQL_NULL_HANDLE
Definition: cODBCEnv.h:32
const SQLSMALLINT m_nSQLHandleType
SQL_HANDLE_STMT, SQL_HANDLE_DBC, SQL_HANDLE_ENV.
Definition: cODBCEnv.h:30
Definition: cODBCEnv.h:109
bool GetInfoStr(SQLUSMALLINT nInfoType, OUT cStringA &sVal)
Definition: cODBCEnv.h:124
virtual ISQLStatement * AllocISQLStatement(const cSQLCmd &oCmd) override
Definition: cODBCEnv.h:149
cODBCDatabase(cODBCBase *pParent)
Definition: cODBCEnv.h:114
Definition: cODBCEnv.h:162
virtual ISQLDatabase * AllocISQLDatabase(const cSQLConnectionString &rConnectionString) override
Definition: cODBCEnv.h:176
IUNKNOWN_DISAMBIG(SUPER_t)
Definition: cODBCEnv.h:57
cODBCStatement(cODBCBase *pParent, const cSQLCmd &oCmd)
Definition: cODBCEnv.h:67
Definition: cSQLCmd.h:36
Definition: cSQLConfig.h:103
Definition: cSQLBase.h:30
Definition: cSQLBase.h:56
Definition: cVariant.h:26
Definition: cRefPtr.h:22
Definition: cSingleton.h:127
Definition: ISQLDriver.h:44
Definition: ISQLDriver.h:55
Definition: ISQLDriver.h:30
Definition: cMesh.h:22
INT16 SQL_TYPE_t
Internal/Native/driver type code. enum SWORD = SQL_TYPE_NULL = 0, short int.
Definition: cSQLConfig.h:19
int SQL_COLUMN_t
what field/column/parameter number. 1 based. SQLUSMALLINT
Definition: cSQLBase.h:23
int ITERATE_t
like size_t but signed
Definition: Index.h:28
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
Definition: cSQLConfig.h:29
static const StrLen_t k_LEN_MAX
arbitrary max size for Format() etc. NOTE: _MSC_VER says stack frame should be at least 16384
Definition: StrT.h:75