00001
00002
00003
00004
00005
00006
00007
00009
00010 #ifndef __wx_dbi_h__
00011 #define __wx_dbi_h__
00012
00013 #include <wx/wxprec.h>
00014
00015 #ifndef WX_PRECOMP
00016 # include "wx/wx.h"
00017 #endif
00018
00019 #if _MSC_VER > 1000
00020 # ifdef _DEBUG
00021 # include "crtdbg.h"
00022 # define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
00023 # endif // def _DEBUG
00024 #endif // _MSC_VER > 1000
00025
00026 #ifdef _MSC_VER
00027 #pragma warning (disable : 4786) // identifier was truncated to '255' characters in the browser information
00028 #endif // def _MSC_VER
00029
00030 #include <map>
00031
00032 #include <wx/variant.h>
00033
00034 #include <wx/exception.h>
00035 #include <wx/dbi/types.h>
00036 #include <wx/dbi/record.h>
00037
00038 namespace wx
00039 {
00040
00062 namespace DBI
00063 {
00064
00065
00066
00067
00068
00069
00070 #define DATABASE_HOST wxT("Host")
00071 #define DATABASE_NAME wxT("Name")
00072 #define DATABASE_LOGON wxT("Logon")
00073 #define DATABASE_PASSWORD wxT("Password")
00074
00075 class Statement;
00076
00082 class Database
00083 {
00084
00085
00086 public:
00091 class ConnectionInfo : private std::map<wxString, wxString>
00092 {
00093 public:
00094 ConnectionInfo()
00095 {}
00096 ConnectionInfo(const ConnectionInfo& cni);
00097 ConnectionInfo& operator=(const ConnectionInfo& cni);
00098
00099 public:
00105 void Set(const wxString& sName, const wxString& sValue);
00106
00113 wxString Get(const wxString& sName) const;
00114
00120 bool IsSet(const wxString& sName) const;
00121 };
00122
00123
00124 public:
00128 Database()
00129 {}
00130
00135 virtual ~Database()
00136 {}
00137
00138
00139
00140
00141 public:
00142
00143
00160 virtual void Connect(const ConnectionInfo& cni) = 0;
00161
00165 virtual void Disconnect() = 0;
00166
00170 virtual bool IsConnected() = 0;
00171
00172
00176 virtual void Begin()
00177 {
00178 wxLogFatalError(wxT("Database::Begin() Transaction support not implemented"));
00179 }
00180
00184 virtual void Rollback()
00185 {
00186 wxLogFatalError(wxT("Database::Rollback() Transaction support not implemented"));
00187 }
00188
00192 virtual void Commit()
00193 {
00194 wxLogFatalError(wxT("Database::Commit() Transaction support not implemented"));
00195 }
00196
00197
00198
00205 virtual Statement * Prepare
00206 (
00207 const wxString& sQuery
00208 ) = 0;
00209
00210
00211
00216 virtual wxArrayString GetDatabases() = 0;
00217
00223 virtual bool DatabaseExists
00224 (
00225 const wxString& sDatabaseName
00226 ) = 0;
00227
00231 virtual wxArrayString GetTables() = 0;
00232
00238 virtual bool TableExists
00239 (
00240 const wxString& sTableName
00241 ) = 0;
00242
00243
00244 protected:
00245 ConnectionInfo m_cni;
00246 };
00247
00248 class Statement
00249 {
00250
00251
00252
00253 public:
00254 Statement(Database * pdbOwner, const wxString& sNewQuery);
00255 virtual ~Statement()
00256 {}
00257
00258
00259
00260
00261 public:
00262
00267 wxString GetQuery();
00268 virtual bool DataAvailable() = 0;
00269 virtual void ExecutePrepared
00270 (
00271 const ArrayRecord& raParameters = ArrayRecord()
00272 ) = 0;
00273 virtual void ExecuteTemporary
00274 (
00275 const ArrayRecord& raParameters = ArrayRecord()
00276 ) = 0;
00277 void Fetch(ArrayRecord& ar);
00278 void Fetch(HashRecord& hr);
00279 void Fetch(ArrayRecordArray& ara);
00280 void Fetch(HashRecordArray& hra);
00281
00287 virtual long GetLastInsertId();
00288
00289 protected:
00290 virtual int GetFieldCount() = 0;
00291 virtual void MoveNext() = 0;
00292 virtual void GetFieldValue
00293 (
00294 int nIndex,
00295 wxVariant& v
00296 ) = 0;
00297 virtual wxString GetFieldName
00298 (
00299 int nIndex
00300 ) = 0;
00301
00302
00303 protected:
00304 Database * pdb;
00305 wxString sQuery;
00306 };
00307
00308 class StatementCache
00309 {
00310
00311 private:
00312 typedef std::map<wxString, Statement *> Cache;
00313
00314
00315 public:
00316 StatementCache(Database * pdbNew);
00317 virtual ~StatementCache();
00318 private:
00319 StatementCache();
00320
00321
00322 public:
00330 virtual void CacheExecute
00331 (
00332 const wxString& sName,
00333 const wxString& sQuery,
00334 const ArrayRecord& arParameters = ArrayRecord()
00335 );
00336
00345 virtual void CacheExecute
00346 (
00347 const wxString& sName,
00348 const wxString& sQuery,
00349 const ArrayRecord& arParameters,
00350 wxVariant& v
00351 );
00352
00361 virtual void CacheExecute
00362 (
00363 const wxString& sName,
00364 const wxString& sQuery,
00365 const ArrayRecord& arParameters,
00366 ArrayRecord& arResult
00367 );
00368
00377 virtual void CacheExecute
00378 (
00379 const wxString& sName,
00380 const wxString& sQuery,
00381 const ArrayRecord& arParameters,
00382 HashRecord& hrResult
00383 );
00384
00393 virtual void CacheExecute
00394 (
00395 const wxString& sName,
00396 const wxString& sQuery,
00397 const ArrayRecord& arParameters,
00398 ArrayRecordArray& araResult
00399 );
00400
00409 virtual void CacheExecute
00410 (
00411 const wxString& sName,
00412 const wxString& sQuery,
00413 const ArrayRecord& arParameters,
00414 HashRecordArray& hraResult
00415 );
00416
00428 virtual void CacheExecuteInsert
00429 (
00430 const wxString& sName,
00431 const wxString& sQuery,
00432 const ArrayRecord& arParameters,
00433 long& nLastInsertId
00434 );
00435
00442 virtual void ExecuteTemporary
00443 (
00444 const wxString& sQuery,
00445 const ArrayRecord& arParameters = ArrayRecord()
00446 );
00447
00456 virtual void ExecuteTemporary
00457 (
00458 const wxString& sQuery,
00459 const ArrayRecord& arParameters,
00460 ArrayRecordArray& araResult
00461 );
00462
00463 virtual void Clear();
00464
00465 private:
00466 Statement * HandleCaching
00467 (
00468 const wxString& sName,
00469 const wxString& sQuery
00470 );
00471
00476 void Delete(const wxString& sName);
00477
00482 bool Exists(const wxString& sName);
00483
00484 protected:
00485 Cache cch;
00486 Database * pdb;
00487 };
00488
00489 }
00490
00491 }
00492
00493 #ifdef wxDBI_POSTGRES
00494 #include <wx/dbi/postgres.h>
00495 #endif // def wxDBI_POSTGRES
00496 #ifdef wxDBI_SQLITE
00497 #include <wx/dbi/sqlite.h>
00498 #endif // def wxDBI_SQLITE
00499
00500 #endif // ndef __wx_dbi_h__