home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / include / wx / db.h < prev    next >
C/C++ Source or Header  |  2002-12-04  |  37KB  |  782 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name:        wx/db.h
  3. // Purpose:     Header file wxDb class.  The wxDb class represents a connection
  4. //              to an ODBC data source.  The wxDb class allows operations on the data
  5. //              source such as opening and closing the data source.
  6. // Author:      Doug Card
  7. // Modified by: George Tasker
  8. //              Bart Jourquin
  9. //              Mark Johnson, wxWindows@mj10777.de
  10. // Mods:        Dec, 1998:
  11. //                -Added support for SQL statement logging and database cataloging
  12. //                     April, 1999
  13. //                -Added QUERY_ONLY mode support to reduce default number of cursors
  14. //                -Added additional SQL logging code
  15. //                -Added DEBUG-ONLY tracking of Ctable objects to detect orphaned DB connections
  16. //                -Set ODBC option to only read committed writes to the DB so all
  17. //                     databases operate the same in that respect
  18. //
  19. // Created:     9.96
  20. // RCS-ID:      $Id: db.h,v 1.61.2.2 2002/12/03 19:00:43 rgammans Exp $
  21. // Copyright:   (c) 1996 Remstar International, Inc.
  22. // Licence:     wxWindows licence, plus:
  23. // Notice:      This class library and its intellectual design are free of charge for use,
  24. //              modification, enhancement, debugging under the following conditions:
  25. //              1) These classes may only be used as part of the implementation of a
  26. //                 wxWindows-based application
  27. //              2) All enhancements and bug fixes are to be submitted back to the wxWindows
  28. //                 user groups free of all charges for use with the wxWindows library.
  29. //              3) These classes may not be distributed as part of any other class library,
  30. //                 DLL, text (written or electronic), other than a complete distribution of
  31. //                 the wxWindows GUI development toolkit.
  32. //
  33. ///////////////////////////////////////////////////////////////////////////////
  34.  
  35. #ifndef _WX_DB_H_
  36. #define _WX_DB_H_
  37.  
  38.  
  39. // BJO 20000503: introduce new GetColumns members which are more database independant and 
  40. //               return columns in the order they were created
  41. #define OLD_GETCOLUMNS 1
  42. #define EXPERIMENTAL_WXDB_FUNCTIONS 1
  43.  
  44. #include "wx/version.h"
  45.  
  46. #if defined(__GNUG__) && !defined(__APPLE__)
  47.     #pragma interface "db.h"
  48. #endif
  49.  
  50. #include "wx/setup.h"
  51.  
  52. #include "wx/defs.h"
  53. #include "wx/string.h"
  54.  
  55. #ifdef __VISUALC__
  56.     // we need to include standard Windows headers but we can't include
  57.     // <windows.h> directly when using MFC because it includes it itself in a
  58.     // different manner
  59.     #if wxUSE_MFC
  60.         #include <afxwin.h>
  61.     #else // !wxUSE_MFC
  62.         #ifndef STRICT
  63.             #define STRICT 1
  64.         #endif
  65.  
  66.         #include <windows.h>
  67.         #include "wx/msw/winundef.h"
  68.     #endif // wxUSE_MFC/!wxUSE_MFC
  69.  
  70.     // If you use the wxDbCreateDataSource() function with MSW/VC6,
  71.     // you cannot use the iODBC headers, you must use the VC headers,
  72.     // plus the odbcinst.h header - gt Nov 2 2000
  73.     //
  74.     // Must add "odbccp32.lib" in \wx2\wxWindows\src\makevc.env to the WINLIBS= line
  75.     //
  76.     #include "sql.h"
  77.     #include "sqlext.h"
  78.     #include "odbcinst.h"
  79. #elif defined( __VMS )
  80.     // For OpenVMS use the ones from the library
  81.     extern "C" {
  82.         #include <isql.h>
  83.         #include <isqlext.h>
  84.     }
  85. #else // !__VISUALC__, !__VMS
  86.     extern "C" {
  87.         #include "wx/isql.h"
  88.         #include "wx/isqlext.h"
  89.     }
  90. #endif
  91.  
  92.  
  93. typedef float SFLOAT;
  94. typedef double SDOUBLE;
  95. typedef unsigned int UINT;
  96. #define ULONG UDWORD
  97.  
  98. #ifndef wxODBC_FWD_ONLY_CURSORS
  99. #define wxODBC_FWD_ONLY_CURSORS 1
  100. #endif
  101.  
  102. enum enumDummy {enumDum1};
  103.  
  104. #ifndef SQL_C_BOOLEAN
  105. #define SQL_C_BOOLEAN(datatype) (sizeof(datatype) == 1 ? SQL_C_UTINYINT : (sizeof(datatype) == 2 ? SQL_C_USHORT : SQL_C_ULONG))
  106. //#  define SQL_C_BOOLEAN (sizeof(int) == 2 ? SQL_C_USHORT : SQL_C_ULONG)
  107. #endif
  108.  
  109. #ifndef SQL_C_ENUM
  110. #define SQL_C_ENUM (sizeof(enumDummy) == 2 ? SQL_C_USHORT : SQL_C_ULONG)
  111. #endif
  112.  
  113. #ifndef SQL_C_BLOB
  114.     #ifdef SQL_LONGVARBINARY
  115.         #define SQL_C_BLOB SQL_LONGVARBINARY
  116.     #elif SQL_VARBINARY
  117.         #define SQL_C_BLOB SQL_VARBINARY
  118.     #endif
  119. #endif
  120. /*
  121. #ifndef TRUE
  122. #define TRUE true
  123. #endif
  124.  
  125. #ifndef FALSE
  126. #define FALSE false
  127. #endif
  128. */
  129. const int wxDB_PATH_MAX                 = 254;
  130.  
  131. WXDLLEXPORT_DATA(extern wxChar const *) SQL_LOG_FILENAME;
  132. WXDLLEXPORT_DATA(extern wxChar const *) SQL_CATALOG_FILENAME;
  133.  
  134. // Database Globals
  135. const int DB_TYPE_NAME_LEN            = 40;
  136. const int DB_MAX_STATEMENT_LEN        = 4096;
  137. const int DB_MAX_WHERE_CLAUSE_LEN     = 2048;
  138. const int DB_MAX_ERROR_MSG_LEN        = 512;
  139. const int DB_MAX_ERROR_HISTORY        = 5;
  140. const int DB_MAX_TABLE_NAME_LEN       = 128;
  141. const int DB_MAX_COLUMN_NAME_LEN      = 128;
  142.  
  143. const int DB_DATA_TYPE_VARCHAR        = 1;
  144. const int DB_DATA_TYPE_INTEGER        = 2;
  145. const int DB_DATA_TYPE_FLOAT          = 3;
  146. const int DB_DATA_TYPE_DATE           = 4;
  147. const int DB_DATA_TYPE_BLOB           = 5;
  148.  
  149. const int DB_SELECT_KEYFIELDS         = 1;
  150. const int DB_SELECT_WHERE             = 2;
  151. const int DB_SELECT_MATCHING          = 3;
  152. const int DB_SELECT_STATEMENT         = 4;
  153.  
  154. const int DB_UPD_KEYFIELDS            = 1;
  155. const int DB_UPD_WHERE                = 2;
  156.  
  157. const int DB_DEL_KEYFIELDS            = 1;
  158. const int DB_DEL_WHERE                = 2;
  159. const int DB_DEL_MATCHING             = 3;
  160.  
  161. const int DB_WHERE_KEYFIELDS          = 1;
  162. const int DB_WHERE_MATCHING           = 2;
  163.  
  164. const int DB_GRANT_SELECT             = 1;
  165. const int DB_GRANT_INSERT             = 2;
  166. const int DB_GRANT_UPDATE             = 4;
  167. const int DB_GRANT_DELETE             = 8;
  168. const int DB_GRANT_ALL                = DB_GRANT_SELECT | DB_GRANT_INSERT | DB_GRANT_UPDATE | DB_GRANT_DELETE;
  169.  
  170. // ODBC Error codes (derived from ODBC SqlState codes)
  171. enum wxODBC_ERRORS
  172. {
  173.     DB_FAILURE                        = 0,
  174.     DB_SUCCESS                        = 1,
  175.     DB_ERR_NOT_IN_USE,
  176.     DB_ERR_GENERAL_WARNING,                            // SqlState = '01000'
  177.     DB_ERR_DISCONNECT_ERROR,                           // SqlState = '01002'
  178.     DB_ERR_DATA_TRUNCATED,                             // SqlState = '01004'
  179.     DB_ERR_PRIV_NOT_REVOKED,                           // SqlState = '01006'
  180.     DB_ERR_INVALID_CONN_STR_ATTR,                      // SqlState = '01S00'
  181.     DB_ERR_ERROR_IN_ROW,                               // SqlState = '01S01'
  182.     DB_ERR_OPTION_VALUE_CHANGED,                       // SqlState = '01S02'
  183.     DB_ERR_NO_ROWS_UPD_OR_DEL,                         // SqlState = '01S03'
  184.     DB_ERR_MULTI_ROWS_UPD_OR_DEL,                      // SqlState = '01S04'
  185.     DB_ERR_WRONG_NO_OF_PARAMS,                         // SqlState = '07001'
  186.     DB_ERR_DATA_TYPE_ATTR_VIOL,                        // SqlState = '07006'
  187.     DB_ERR_UNABLE_TO_CONNECT,                          // SqlState = '08001'
  188.     DB_ERR_CONNECTION_IN_USE,                          // SqlState = '08002'
  189.     DB_ERR_CONNECTION_NOT_OPEN,                        // SqlState = '08003'
  190.     DB_ERR_REJECTED_CONNECTION,                        // SqlState = '08004'
  191.     DB_ERR_CONN_FAIL_IN_TRANS,                         // SqlState = '08007'
  192.     DB_ERR_COMM_LINK_FAILURE,                          // SqlState = '08S01'
  193.     DB_ERR_INSERT_VALUE_LIST_MISMATCH,                 // SqlState = '21S01'
  194.     DB_ERR_DERIVED_TABLE_MISMATCH,                     // SqlState = '21S02'
  195.     DB_ERR_STRING_RIGHT_TRUNC,                         // SqlState = '22001'
  196.     DB_ERR_NUMERIC_VALUE_OUT_OF_RNG,                   // SqlState = '22003'
  197.     DB_ERR_ERROR_IN_ASSIGNMENT,                        // SqlState = '22005'
  198.     DB_ERR_DATETIME_FLD_OVERFLOW,                      // SqlState = '22008'
  199.     DB_ERR_DIVIDE_BY_ZERO,                             // SqlState = '22012'
  200.     DB_ERR_STR_DATA_LENGTH_MISMATCH,                   // SqlState = '22026'
  201.     DB_ERR_INTEGRITY_CONSTRAINT_VIOL,                  // SqlState = '23000'
  202.     DB_ERR_INVALID_CURSOR_STATE,                       // SqlState = '24000'
  203.     DB_ERR_INVALID_TRANS_STATE,                        // SqlState = '25000'
  204.     DB_ERR_INVALID_AUTH_SPEC,                          // SqlState = '28000'
  205.     DB_ERR_INVALID_CURSOR_NAME,                        // SqlState = '34000'
  206.     DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL,                // SqlState = '37000'
  207.     DB_ERR_DUPLICATE_CURSOR_NAME,                      // SqlState = '3C000'
  208.     DB_ERR_SERIALIZATION_FAILURE,                      // SqlState = '40001'
  209.     DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL2,               // SqlState = '42000'
  210.     DB_ERR_OPERATION_ABORTED,                          // SqlState = '70100'
  211.     DB_ERR_UNSUPPORTED_FUNCTION,                       // SqlState = 'IM001'
  212.     DB_ERR_NO_DATA_SOURCE,                             // SqlState = 'IM002'
  213.     DB_ERR_DRIVER_LOAD_ERROR,                          // SqlState = 'IM003'
  214.     DB_ERR_SQLALLOCENV_FAILED,                         // SqlState = 'IM004'
  215.     DB_ERR_SQLALLOCCONNECT_FAILED,                     // SqlState = 'IM005'
  216.     DB_ERR_SQLSETCONNECTOPTION_FAILED,                 // SqlState = 'IM006'
  217.     DB_ERR_NO_DATA_SOURCE_DLG_PROHIB,                  // SqlState = 'IM007'
  218.     DB_ERR_DIALOG_FAILED,                              // SqlState = 'IM008'
  219.     DB_ERR_UNABLE_TO_LOAD_TRANSLATION_DLL,             // SqlState = 'IM009'
  220.     DB_ERR_DATA_SOURCE_NAME_TOO_LONG,                  // SqlState = 'IM010'
  221.     DB_ERR_DRIVER_NAME_TOO_LONG,                       // SqlState = 'IM011'
  222.     DB_ERR_DRIVER_KEYWORD_SYNTAX_ERROR,                // SqlState = 'IM012'
  223.     DB_ERR_TRACE_FILE_ERROR,                           // SqlState = 'IM013'
  224.     DB_ERR_TABLE_OR_VIEW_ALREADY_EXISTS,               // SqlState = 'S0001'
  225.     DB_ERR_TABLE_NOT_FOUND,                            // SqlState = 'S0002'
  226.     DB_ERR_INDEX_ALREADY_EXISTS,                       // SqlState = 'S0011'
  227.     DB_ERR_INDEX_NOT_FOUND,                            // SqlState = 'S0012'
  228.     DB_ERR_COLUMN_ALREADY_EXISTS,                      // SqlState = 'S0021'
  229.     DB_ERR_COLUMN_NOT_FOUND,                           // SqlState = 'S0022'
  230.     DB_ERR_NO_DEFAULT_FOR_COLUMN,                      // SqlState = 'S0023'
  231.     DB_ERR_GENERAL_ERROR,                              // SqlState = 'S1000'
  232.     DB_ERR_MEMORY_ALLOCATION_FAILURE,                  // SqlState = 'S1001'
  233.     DB_ERR_INVALID_COLUMN_NUMBER,                      // SqlState = 'S1002'
  234.     DB_ERR_PROGRAM_TYPE_OUT_OF_RANGE,                  // SqlState = 'S1003'
  235.     DB_ERR_SQL_DATA_TYPE_OUT_OF_RANGE,                 // SqlState = 'S1004'
  236.     DB_ERR_OPERATION_CANCELLED,                        // SqlState = 'S1008'
  237.     DB_ERR_INVALID_ARGUMENT_VALUE,                     // SqlState = 'S1009'
  238.     DB_ERR_FUNCTION_SEQUENCE_ERROR,                    // SqlState = 'S1010'
  239.     DB_ERR_OPERATION_INVALID_AT_THIS_TIME,             // SqlState = 'S1011'
  240.     DB_ERR_INVALID_TRANS_OPERATION_CODE,               // SqlState = 'S1012'
  241.     DB_ERR_NO_CURSOR_NAME_AVAIL,                       // SqlState = 'S1015'
  242.     DB_ERR_INVALID_STR_OR_BUF_LEN,                     // SqlState = 'S1090'
  243.     DB_ERR_DESCRIPTOR_TYPE_OUT_OF_RANGE,               // SqlState = 'S1091'
  244.     DB_ERR_OPTION_TYPE_OUT_OF_RANGE,                   // SqlState = 'S1092'
  245.     DB_ERR_INVALID_PARAM_NO,                           // SqlState = 'S1093'
  246.     DB_ERR_INVALID_SCALE_VALUE,                        // SqlState = 'S1094'
  247.     DB_ERR_FUNCTION_TYPE_OUT_OF_RANGE,                 // SqlState = 'S1095'
  248.     DB_ERR_INF_TYPE_OUT_OF_RANGE,                      // SqlState = 'S1096'
  249.     DB_ERR_COLUMN_TYPE_OUT_OF_RANGE,                   // SqlState = 'S1097'
  250.     DB_ERR_SCOPE_TYPE_OUT_OF_RANGE,                    // SqlState = 'S1098'
  251.     DB_ERR_NULLABLE_TYPE_OUT_OF_RANGE,                 // SqlState = 'S1099'
  252.     DB_ERR_UNIQUENESS_OPTION_TYPE_OUT_OF_RANGE,        // SqlState = 'S1100'
  253.     DB_ERR_ACCURACY_OPTION_TYPE_OUT_OF_RANGE,          // SqlState = 'S1101'
  254.     DB_ERR_DIRECTION_OPTION_OUT_OF_RANGE,              // SqlState = 'S1103'
  255.     DB_ERR_INVALID_PRECISION_VALUE,                    // SqlState = 'S1104'
  256.     DB_ERR_INVALID_PARAM_TYPE,                         // SqlState = 'S1105'
  257.     DB_ERR_FETCH_TYPE_OUT_OF_RANGE,                    // SqlState = 'S1106'
  258.     DB_ERR_ROW_VALUE_OUT_OF_RANGE,                     // SqlState = 'S1107'
  259.     DB_ERR_CONCURRENCY_OPTION_OUT_OF_RANGE,            // SqlState = 'S1108'
  260.     DB_ERR_INVALID_CURSOR_POSITION,                    // SqlState = 'S1109'
  261.     DB_ERR_INVALID_DRIVER_COMPLETION,                  // SqlState = 'S1110'
  262.     DB_ERR_INVALID_BOOKMARK_VALUE,                     // SqlState = 'S1111'
  263.     DB_ERR_DRIVER_NOT_CAPABLE,                         // SqlState = 'S1C00'
  264.     DB_ERR_TIMEOUT_EXPIRED                             // SqlState = 'S1T00'
  265. };
  266.  
  267. #ifndef MAXNAME
  268. #define MAXNAME         31
  269. #endif
  270.  
  271. #ifndef SQL_MAX_AUTHSTR_LEN
  272. // There does not seem to be a standard for this, so I am
  273. // defaulting to the value that MS uses
  274. #define SQL_MAX_AUTHSTR_LEN MAXNAME
  275. #endif
  276.  
  277. class WXDLLEXPORT wxDbConnectInf
  278. {
  279.     private:
  280.         bool freeHenvOnDestroy;
  281.  
  282.     public:
  283.         HENV Henv;
  284.         wxChar Dsn[SQL_MAX_DSN_LENGTH+1];                  // Data Source Name
  285.         wxChar Uid[SQL_MAX_USER_NAME_LEN+1];               // User ID
  286.         wxChar AuthStr[SQL_MAX_AUTHSTR_LEN+1];             // Authorization string (password)
  287.  
  288.         wxString Description;                              // Not sure what the max length is
  289.         wxString FileType;                                 // Not sure what the max length is
  290.  
  291.         // Optionals needed for some databases like dBase
  292.         wxString DefaultDir;                               // Directory that db file resides in
  293.  
  294.     public:
  295.  
  296.         wxDbConnectInf();
  297.         wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID=wxEmptyString, 
  298.                        const wxString &password=wxEmptyString, const wxString &defaultDir=wxEmptyString, 
  299.                        const wxString &description=wxEmptyString, const wxString &fileType=wxEmptyString);
  300.  
  301.         ~wxDbConnectInf();
  302.  
  303.         bool             Initialize();
  304.  
  305.         bool             AllocHenv();
  306.         void             FreeHenv();
  307.  
  308.         // Accessors
  309.         const HENV       &GetHenv()          { return Henv; };
  310.  
  311.         const wxChar    *GetDsn()           { return Dsn; };
  312.  
  313.         const wxChar    *GetUid()           { return Uid; };
  314.         const wxChar    *GetUserID()        { return Uid; };
  315.  
  316.         const wxChar    *GetAuthStr()       { return AuthStr; };
  317.         const wxChar    *GetPassword()      { return AuthStr; };
  318.  
  319.         const wxChar    *GetDescription()   { return Description; };
  320.         const wxChar    *GetFileType()      { return FileType; };
  321.         const wxChar    *GetDefaultDir()    { return DefaultDir; };
  322.  
  323.         void             SetHenv(const HENV henv)               { Henv = henv; };
  324.  
  325.         void             SetDsn(const wxString &dsn);
  326.  
  327.         void             SetUserID(const wxString &userID);
  328.         void             SetUid(const wxString &uid)            { SetUserID(uid); };
  329.  
  330.         void             SetPassword(const wxString &password);
  331.         void             SetAuthStr(const wxString &authstr)    { SetPassword(authstr); };
  332.  
  333.         void             SetDescription(const wxString &desc)   { Description   = desc;     };
  334.         void             SetFileType(const wxString &fileType)  { FileType      = fileType; };
  335.         void             SetDefaultDir(const wxString &defDir)  { DefaultDir    = defDir;   };
  336. };  // class wxDbConnectInf
  337.  
  338.  
  339. struct WXDLLEXPORT wxDbSqlTypeInfo
  340. {
  341.     wxString    TypeName;
  342.     SWORD       FsqlType;
  343.     long        Precision;
  344.     short       CaseSensitive;
  345. //    short     MinimumScale;
  346.     short       MaximumScale;
  347. };
  348.  
  349.  
  350. class WXDLLEXPORT wxDbColFor
  351. {
  352. public:
  353.     wxString       s_Field;              // Formated String for Output
  354.     wxString       s_Format[7];          // Formated Objects - TIMESTAMP has the biggest (7)
  355.     wxString       s_Amount[7];          // Formated Objects - amount of things that can be formatted
  356.     int            i_Amount[7];          // Formated Objects - TT MM YYYY HH MM SS m
  357.     int            i_Nation;             // 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US
  358.     int            i_dbDataType;         // conversion of the 'sqlDataType' to the generic data type used by these classes
  359.     SWORD          i_sqlDataType;
  360.  
  361.     wxDbColFor();
  362.     ~wxDbColFor();
  363.  
  364.     void           Initialize();
  365.     int            Format(int Nation, int dbDataType, SWORD sqlDataType, short columnSize, short decimalDigits);
  366. };
  367.  
  368.  
  369. class WXDLLEXPORT wxDbColInf
  370. {
  371. public:
  372.     wxChar       catalog[128+1];
  373.     wxChar       schema[128+1];
  374.     wxChar       tableName[DB_MAX_TABLE_NAME_LEN+1];
  375.     wxChar       colName[DB_MAX_COLUMN_NAME_LEN+1];
  376.     SWORD        sqlDataType;
  377.     wxChar       typeName[128+1];
  378.     SWORD        columnSize;
  379.     SWORD        bufferLength;
  380.     short        decimalDigits;
  381.     short        numPrecRadix;
  382.     short        nullable;
  383.     wxChar       remarks[254+1];
  384.     int          dbDataType;  // conversion of the 'sqlDataType' to the generic data type used by these classes
  385.  // mj10777.19991224 : new
  386.     int          PkCol;       // Primary key column       0=No; 1= First Key, 2 = Second Key etc.
  387.     wxChar       PkTableName[DB_MAX_TABLE_NAME_LEN+1]; // Tables that use this PKey as a FKey
  388.     int          FkCol;       // Foreign key column       0=No; 1= First Key, 2 = Second Key etc.
  389.     wxChar       FkTableName[DB_MAX_TABLE_NAME_LEN+1]; // Foreign key table name
  390.     wxDbColFor  *pColFor;                              // How should this columns be formatted
  391.  
  392.     wxDbColInf();
  393.     ~wxDbColInf();
  394.  
  395.     bool Initialize();
  396. };
  397.  
  398.  
  399. class WXDLLEXPORT wxDbTableInf        // Description of a Table
  400. {
  401. public:
  402.     wxChar      tableName[DB_MAX_TABLE_NAME_LEN+1];
  403.     wxChar      tableType[254+1];           // "TABLE" or "SYSTEM TABLE" etc.
  404.     wxChar      tableRemarks[254+1];
  405.     UWORD       numCols;                    // How many Columns does this Table have: GetColumnCount(..);
  406.     wxDbColInf *pColInf;                    // pColInf = NULL ; User can later call GetColumns(..);
  407.  
  408.     wxDbTableInf();
  409.     ~wxDbTableInf();
  410.  
  411.     bool             Initialize();
  412. };
  413.  
  414.  
  415. class WXDLLEXPORT wxDbInf     // Description of a Database
  416. {
  417. public:
  418.     wxChar        catalog[128+1];
  419.     wxChar        schema[128+1];
  420.     int           numTables;           // How many tables does this database have
  421.     wxDbTableInf *pTableInf;           // pTableInf = new wxDbTableInf[numTables];
  422.  
  423.     wxDbInf();
  424.     ~wxDbInf();
  425.  
  426.     bool          Initialize();
  427. };
  428.  
  429.  
  430. enum wxDbSqlLogState
  431. {
  432.     sqlLogOFF,
  433.     sqlLogON
  434. };
  435.  
  436. // These are the databases currently tested and working with these classes
  437. // See the comments in wxDb::Dbms() for exceptions/issues with
  438. // each of these database engines
  439. enum wxDBMS
  440. {
  441.     dbmsUNIDENTIFIED,
  442.     dbmsORACLE,
  443.     dbmsSYBASE_ASA,        // Adaptive Server Anywhere
  444.     dbmsSYBASE_ASE,        // Adaptive Server Enterprise
  445.     dbmsMS_SQL_SERVER,
  446.     dbmsMY_SQL,
  447.     dbmsPOSTGRES,
  448.     dbmsACCESS,
  449.     dbmsDBASE,
  450.     dbmsINFORMIX,
  451.     dbmsVIRTUOSO,
  452.     dbmsDB2,
  453.     dbmsINTERBASE,
  454.     dbmsPERVASIVE_SQL,
  455.     dbmsXBASE_SEQUITER
  456. };
  457.  
  458.  
  459. // The wxDb::errorList is copied to this variable when the wxDb object
  460. // is closed.  This way, the error list is still available after the
  461. // database object is closed.  This is necessary if the database
  462. // connection fails so the calling application can show the operator
  463. // why the connection failed.  Note: as each wxDb object is closed, it
  464. // will overwrite the errors of the previously destroyed wxDb object in
  465. // this variable.
  466.  
  467. WXDLLEXPORT_DATA(extern wxChar) DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN];
  468.  
  469.  
  470. class WXDLLEXPORT wxDb
  471. {
  472. private:
  473.     bool             dbIsOpen;
  474.     bool             dbIsCached;      // Was connection created by caching functions
  475.     wxString         dsn;             // Data source name
  476.     wxString         uid;             // User ID
  477.     wxString         authStr;         // Authorization string (password)
  478.     FILE            *fpSqlLog;        // Sql Log file pointer
  479.     wxDbSqlLogState  sqlLogState;     // On or Off
  480.     bool             fwdOnlyCursors;
  481.     wxDBMS           dbmsType;        // Type of datasource - i.e. Oracle, dBase, SQLServer, etc
  482.  
  483.     // Private member functions
  484.     bool             getDbInfo(void);
  485.     bool             getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo);
  486.     bool             setConnectionOptions(void);
  487.     void             logError(const wxString &errMsg, const wxString &SQLState);
  488.     const wxChar    *convertUserID(const wxChar *userID, wxString &UserID);
  489.     void             initialize();
  490.  
  491. #if !wxODBC_BACKWARD_COMPATABILITY
  492.     // ODBC handles
  493.     HENV  henv;        // ODBC Environment handle
  494.     HDBC  hdbc;        // ODBC DB Connection handle
  495.     HSTMT hstmt;       // ODBC Statement handle
  496.  
  497.     //Error reporting mode
  498.     bool silent;
  499.  
  500.     // Number of Ctable objects connected to this db object.  FOR INTERNAL USE ONLY!!!
  501.     unsigned int nTables;
  502.  
  503.     // Information about logical data types VARCHAR, INTEGER, FLOAT and DATE.
  504.      //
  505.     // This information is obtained from the ODBC driver by use of the
  506.     // SQLGetTypeInfo() function.  The key piece of information is the
  507.     // type name the data source uses for each logical data type.
  508.     // e.g. VARCHAR; Oracle calls it VARCHAR2.
  509.     wxDbSqlTypeInfo typeInfVarchar;
  510.     wxDbSqlTypeInfo typeInfInteger;
  511.     wxDbSqlTypeInfo typeInfFloat;
  512.     wxDbSqlTypeInfo typeInfDate;
  513.     wxDbSqlTypeInfo typeInfBlob;
  514. #endif
  515.  
  516. public:
  517.  
  518.     void             setCached(bool cached)  { dbIsCached = cached; };  // This function must only be called by wxDbGetConnection() and wxDbCloseConnections!!!
  519.     bool             IsCached() { return dbIsCached; };
  520.  
  521.     bool             GetDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
  522.                             { return getDataTypeInfo(fSqlType, structSQLTypeInfo); }
  523.  
  524. #if wxODBC_BACKWARD_COMPATABILITY
  525.     // ODBC handles
  526.     HENV  henv;        // ODBC Environment handle
  527.     HDBC  hdbc;        // ODBC DB Connection handle
  528.     HSTMT hstmt;       // ODBC Statement handle
  529.  
  530.     //Error reporting mode
  531.     bool silent;
  532.  
  533.     // Number of Ctable objects connected to this db object.  FOR INTERNAL USE ONLY!!!
  534.     unsigned int nTables;
  535. #endif
  536.  
  537.     // The following structure contains database information gathered from the
  538.     // datasource when the datasource is first opened.
  539.     struct
  540.     {
  541.         wxChar dbmsName[40];                             // Name of the dbms product
  542.         wxChar dbmsVer[64];                              // Version # of the dbms product
  543.         wxChar driverName[40];                           // Driver name
  544.         wxChar odbcVer[60];                              // ODBC version of the driver
  545.         wxChar drvMgrOdbcVer[60];                        // ODBC version of the driver manager
  546.         wxChar driverVer[60];                            // Driver version
  547.         wxChar serverName[80];                           // Server Name, typically a connect string
  548.         wxChar databaseName[128];                        // Database filename
  549.         wxChar outerJoins[2];                            // Indicates whether the data source supports outer joins
  550.         wxChar procedureSupport[2];                      // Indicates whether the data source supports stored procedures
  551.         wxChar accessibleTables[2];                      // Indicates whether the data source only reports accessible tables in SQLTables.
  552.         UWORD  maxConnections;                           // Maximum # of connections the data source supports
  553.         UWORD  maxStmts;                                 // Maximum # of HSTMTs per HDBC
  554.         UWORD  apiConfLvl;                               // ODBC API conformance level
  555.         UWORD  cliConfLvl;                               // Indicates whether the data source is SAG compliant
  556.         UWORD  sqlConfLvl;                               // SQL conformance level
  557.         UWORD  cursorCommitBehavior;                     // Indicates how cursors are affected by a db commit
  558.         UWORD  cursorRollbackBehavior;                   // Indicates how cursors are affected by a db rollback
  559.         UWORD  supportNotNullClause;                     // Indicates if data source supports NOT NULL clause
  560.         wxChar supportIEF[2];                            // Integrity Enhancement Facility (Referential Integrity)
  561.         UDWORD txnIsolation;                             // Default transaction isolation level supported by the driver
  562.         UDWORD txnIsolationOptions;                      // Transaction isolation level options available
  563.         UDWORD fetchDirections;                          // Fetch directions supported
  564.         UDWORD lockTypes;                                // Lock types supported in SQLSetPos
  565.         UDWORD posOperations;                            // Position operations supported in SQLSetPos
  566.         UDWORD posStmts;                                 // Position statements supported
  567.         UDWORD scrollConcurrency;                        // Concurrency control options supported for scrollable cursors
  568.         UDWORD scrollOptions;                            // Scroll Options supported for scrollable cursors
  569.         UDWORD staticSensitivity;                        // Indicates if additions, deletions and updates can be detected
  570.         UWORD  txnCapable;                               // Indicates if the data source supports transactions
  571.         UDWORD loginTimeout;                             // Number seconds to wait for a login request
  572.     } dbInf;
  573.  
  574.     // ODBC Error Inf.
  575.     SWORD  cbErrorMsg;
  576.     int    DB_STATUS;
  577.     wxChar errorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN];
  578.     wxChar errorMsg[SQL_MAX_MESSAGE_LENGTH];
  579.     SDWORD nativeError;
  580.     wxChar sqlState[20];
  581.  
  582. #if wxODBC_BACKWARD_COMPATABILITY
  583.     // Information about logical data types VARCHAR, INTEGER, FLOAT and DATE.
  584.      //
  585.     // This information is obtained from the ODBC driver by use of the
  586.     // SQLGetTypeInfo() function.  The key piece of information is the
  587.     // type name the data source uses for each logical data type.
  588.     // e.g. VARCHAR; Oracle calls it VARCHAR2.
  589.     wxDbSqlTypeInfo typeInfVarchar;
  590.     wxDbSqlTypeInfo typeInfInteger;
  591.     wxDbSqlTypeInfo typeInfFloat;
  592.     wxDbSqlTypeInfo typeInfDate;
  593.     wxDbSqlTypeInfo typeInfBlob;
  594. #endif
  595.  
  596.     // Public member functions
  597.     wxDb(const HENV &aHenv, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
  598.     ~wxDb();
  599.  
  600.     // Data Source Name, User ID, Password and whether open should fail on data type not supported
  601.     bool         Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported=TRUE);
  602.     bool         Open(wxDbConnectInf *dbConnectInf);
  603.     bool         Open(wxDb *copyDb);  // pointer to a wxDb whose connection info should be copied rather than re-queried
  604.     void         Close(void);
  605.     bool         CommitTrans(void);
  606.     bool         RollbackTrans(void);
  607.     bool         DispAllErrors(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT);
  608.     bool         GetNextError(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT);
  609.     void         DispNextError(void);
  610.     bool         CreateView(const wxString &viewName, const wxString &colList, const wxString &pSqlStmt, bool attemptDrop=TRUE);
  611.     bool         DropView(const wxString &viewName);
  612.     bool         ExecSql(const wxString &pSqlStmt);
  613.     bool         GetNext(void);
  614.     bool         GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FAR *cbReturned);
  615.     bool         Grant(int privileges, const wxString &tableName, const wxString &userList = wxT("PUBLIC"));
  616.     int          TranslateSqlState(const wxString &SQLState);
  617.     wxDbInf     *GetCatalog(const wxChar *userID=NULL);
  618.     bool         Catalog(const wxChar *userID=NULL, const wxString &fileName=SQL_CATALOG_FILENAME);
  619.     int          GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCols);
  620.  
  621.     wxDbColInf  *GetColumns(wxChar *tableName[], const wxChar *userID=NULL);
  622.     wxDbColInf  *GetColumns(const wxString &tableName, UWORD *numCols, const wxChar *userID=NULL); 
  623.  
  624.     int             GetColumnCount(const wxString &tableName, const wxChar *userID=NULL);
  625.     const wxChar   *GetDatabaseName(void)  {return dbInf.dbmsName;}
  626.     const wxString &GetDataSource(void)    {return dsn;}
  627.     const wxString &GetDatasourceName(void){return dsn;}
  628.     const wxString &GetUsername(void)      {return uid;}
  629.     const wxString &GetPassword(void)      {return authStr;}
  630.     bool            IsOpen(void)           {return dbIsOpen;}
  631.     HENV            GetHENV(void)          {return henv;}
  632.     HDBC            GetHDBC(void)          {return hdbc;}
  633.     HSTMT           GetHSTMT(void)         {return hstmt;}
  634.     int             GetTableCount()        {return nTables;}  // number of tables using this connection
  635.     wxDbSqlTypeInfo GetTypeInfVarchar()    {return typeInfVarchar;}
  636.     wxDbSqlTypeInfo GetTypeInfInteger()    {return typeInfInteger;}
  637.     wxDbSqlTypeInfo GetTypeInfFloat()      {return typeInfFloat;}
  638.     wxDbSqlTypeInfo GetTypeInfDate()       {return typeInfDate;}
  639.     wxDbSqlTypeInfo GetTypeInfBlob()       {return typeInfBlob;}
  640.  
  641.     // tableName can refer to a table, view, alias or synonym
  642.     bool         TableExists(const wxString &tableName, const wxChar *userID=NULL, 
  643.                              const wxString &tablePath=wxEmptyString);
  644.     bool         TablePrivileges(const wxString &tableName, const wxString &priv, 
  645.                                  const wxChar *userID=NULL, const wxChar *schema=NULL, 
  646.                                  const wxString &path=wxEmptyString);
  647.  
  648.     // These two functions return the table name or column name in a form ready
  649.     // for use in SQL statements.  For example, if the datasource allows spaces
  650.     // in the table name or column name, the returned string will have the
  651.     // correct enclosing marks around the name to allow it to be properly 
  652.     // included in a SQL statement
  653.     const wxString  SQLTableName(const wxChar *tableName);
  654.     const wxString  SQLColumnName(const wxChar *colName);
  655.  
  656.     void         LogError(const wxString &errMsg, const wxString &SQLState = wxEmptyString) 
  657.                         { logError(errMsg, SQLState); }
  658.     void         SetDebugErrorMessages(bool state) { silent = !state; }
  659.     bool         SetSqlLogging(wxDbSqlLogState state, const wxString &filename = SQL_LOG_FILENAME, 
  660.                                bool append = FALSE);
  661.     bool         WriteSqlLog(const wxString &logMsg);
  662.  
  663.     wxDBMS       Dbms(void);
  664.     bool         ModifyColumn(const wxString &tableName, const wxString &columnName,
  665.                               int dataType, ULONG columnLength=0,
  666.                               const wxString &optionalParam=wxEmptyString);
  667.  
  668.     bool         FwdOnlyCursors(void)  {return fwdOnlyCursors;}
  669.  
  670.     // These two functions are provided strictly for use by wxDbTable.
  671.     // DO NOT USE THESE FUNCTIONS, OR MEMORY LEAKS MAY OCCUR
  672.     void         incrementTableCount() { nTables++; return; }
  673.     void         decrementTableCount() { nTables--; return; }
  674.  
  675. };  // wxDb
  676.  
  677.  
  678. // This structure forms a node in a linked list.  The linked list of "DbList" objects
  679. // keeps track of allocated database connections.  This allows the application to
  680. // open more than one database connection through ODBC for multiple transaction support
  681. // or for multiple database support.
  682. struct wxDbList
  683. {
  684.     wxDbList *PtrPrev;       // Pointer to previous item in the list
  685.     wxString  Dsn;           // Data Source Name
  686.     wxString  Uid;           // User ID
  687.     wxString  AuthStr;       // Authorization string (password)
  688.     wxDb     *PtrDb;         // Pointer to the wxDb object
  689.     bool      Free;          // Is item free or in use?
  690.     wxDbList *PtrNext;       // Pointer to next item in the list
  691. };
  692.  
  693.  
  694. #ifdef __WXDEBUG__
  695. #include "wx/object.h"
  696. class wxTablesInUse : public wxObject
  697. {
  698.     public:
  699.         const wxChar  *tableName;
  700.         ULONG          tableID;
  701.         class wxDb    *pDb;
  702. };  // wxTablesInUse
  703. #endif
  704.  
  705.  
  706. // The following routines allow a user to get new database connections, free them
  707. // for other code segments to use, or close all of them when the application has
  708. // completed.
  709. wxDb  WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
  710. bool  WXDLLEXPORT  wxDbFreeConnection(wxDb *pDb);
  711. void  WXDLLEXPORT  wxDbCloseConnections(void);
  712. int   WXDLLEXPORT  wxDbConnectionsInUse(void);
  713.  
  714.  
  715. // Writes a message to the wxLog window (stdout usually) when an internal error
  716. // situation occurs.  This function only works in DEBUG builds
  717. const wxChar* WXDLLEXPORT wxDbLogExtendedErrorMsg(const wxChar *userText,
  718.                                                   wxDb *pDb,
  719.                                                   const wxChar *ErrFile,
  720.                                                   int ErrLine);
  721.  
  722.  
  723. // This function sets the sql log state for all open wxDb objects
  724. bool  WXDLLEXPORT  wxDbSqlLog(wxDbSqlLogState state, const wxString &filename = SQL_LOG_FILENAME);
  725.  
  726.  
  727. #if 0
  728. // MSW/VC6 ONLY!!!  Experimental
  729. int WXDLLEXPORT wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const wxString &description=wxEmptyString,
  730.                                      bool sysDSN=FALSE, const wxString &defDir=wxEmptyString, wxWindow *parent=NULL);
  731. #endif
  732.  
  733. // This routine allows you to query a driver manager
  734. // for a list of available datasources.  Call this routine
  735. // the first time using SQL_FETCH_FIRST.  Continue to call it
  736. // using SQL_FETCH_NEXT until you've exhausted the list.
  737. bool WXDLLEXPORT wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMax, wxChar *DsDesc,
  738.                                    SWORD DsDescMax, UWORD direction = SQL_FETCH_NEXT);
  739.  
  740.  
  741. // Change this to 0 to remove use of all deprecated functions
  742. #if wxODBC_BACKWARD_COMPATABILITY
  743. //#################################################################################
  744. //############### DEPRECATED functions for backward compatability #################
  745. //#################################################################################
  746.  
  747. // Backward compability structures/classes.  This will eventually go away
  748. const int DB_PATH_MAX      = wxDB_PATH_MAX;
  749.  
  750. typedef wxDb                 wxDB;
  751. typedef wxDbTableInf         wxTableInf;
  752. typedef wxDbColInf           wxColInf;
  753. typedef wxDbColInf           CcolInf;
  754. typedef wxDbColFor           wxColFor;
  755. typedef wxDbSqlTypeInfo      SqlTypeInfo;
  756. typedef wxDbSqlTypeInfo      wxSqlTypeInfo;
  757. typedef enum wxDbSqlLogState sqlLog;
  758. typedef enum wxDbSqlLogState wxSqlLogState;
  759. typedef enum wxDBMS          dbms;
  760. typedef enum wxDBMS          DBMS;
  761. typedef wxODBC_ERRORS        ODBC_ERRORS;
  762. typedef wxDbConnectInf       DbStuff;
  763. typedef wxDbList             DbList;
  764. #ifdef __WXDEBUG__
  765. typedef wxTablesInUse        CstructTablesInUse;
  766. #endif
  767.  
  768. // Deprecated function names that are replaced by the function names listed above
  769. wxDB  WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
  770. bool  WXDLLEXPORT  FreeDbConnection(wxDB *pDb);
  771. void  WXDLLEXPORT  CloseDbConnections(void);
  772. int   WXDLLEXPORT  NumberDbConnectionsInUse(void);
  773.  
  774. bool SqlLog(sqlLog state, const wxChar *filename = SQL_LOG_FILENAME);
  775.  
  776. bool WXDLLEXPORT GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDescMax,
  777.                                UWORD direction = SQL_FETCH_NEXT);
  778. #endif  // Deprecated structures/classes/functions
  779.  
  780. #endif // _WX_DB_H_
  781.  
  782.