+enum wxODBC_ERRORS
+{
+ DB_FAILURE = 0,
+ DB_SUCCESS = 1,
+ DB_ERR_NOT_IN_USE,
+ DB_ERR_GENERAL_WARNING, // SqlState = '01000'
+ DB_ERR_DISCONNECT_ERROR, // SqlState = '01002'
+ DB_ERR_DATA_TRUNCATED, // SqlState = '01004'
+ DB_ERR_PRIV_NOT_REVOKED, // SqlState = '01006'
+ DB_ERR_INVALID_CONN_STR_ATTR, // SqlState = '01S00'
+ DB_ERR_ERROR_IN_ROW, // SqlState = '01S01'
+ DB_ERR_OPTION_VALUE_CHANGED, // SqlState = '01S02'
+ DB_ERR_NO_ROWS_UPD_OR_DEL, // SqlState = '01S03'
+ DB_ERR_MULTI_ROWS_UPD_OR_DEL, // SqlState = '01S04'
+ DB_ERR_WRONG_NO_OF_PARAMS, // SqlState = '07001'
+ DB_ERR_DATA_TYPE_ATTR_VIOL, // SqlState = '07006'
+ DB_ERR_UNABLE_TO_CONNECT, // SqlState = '08001'
+ DB_ERR_CONNECTION_IN_USE, // SqlState = '08002'
+ DB_ERR_CONNECTION_NOT_OPEN, // SqlState = '08003'
+ DB_ERR_REJECTED_CONNECTION, // SqlState = '08004'
+ DB_ERR_CONN_FAIL_IN_TRANS, // SqlState = '08007'
+ DB_ERR_COMM_LINK_FAILURE, // SqlState = '08S01'
+ DB_ERR_INSERT_VALUE_LIST_MISMATCH, // SqlState = '21S01'
+ DB_ERR_DERIVED_TABLE_MISMATCH, // SqlState = '21S02'
+ DB_ERR_STRING_RIGHT_TRUNC, // SqlState = '22001'
+ DB_ERR_NUMERIC_VALUE_OUT_OF_RNG, // SqlState = '22003'
+ DB_ERR_ERROR_IN_ASSIGNMENT, // SqlState = '22005'
+ DB_ERR_DATETIME_FLD_OVERFLOW, // SqlState = '22008'
+ DB_ERR_DIVIDE_BY_ZERO, // SqlState = '22012'
+ DB_ERR_STR_DATA_LENGTH_MISMATCH, // SqlState = '22026'
+ DB_ERR_INTEGRITY_CONSTRAINT_VIOL, // SqlState = '23000'
+ DB_ERR_INVALID_CURSOR_STATE, // SqlState = '24000'
+ DB_ERR_INVALID_TRANS_STATE, // SqlState = '25000'
+ DB_ERR_INVALID_AUTH_SPEC, // SqlState = '28000'
+ DB_ERR_INVALID_CURSOR_NAME, // SqlState = '34000'
+ DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL, // SqlState = '37000'
+ DB_ERR_DUPLICATE_CURSOR_NAME, // SqlState = '3C000'
+ DB_ERR_SERIALIZATION_FAILURE, // SqlState = '40001'
+ DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL2, // SqlState = '42000'
+ DB_ERR_OPERATION_ABORTED, // SqlState = '70100'
+ DB_ERR_UNSUPPORTED_FUNCTION, // SqlState = 'IM001'
+ DB_ERR_NO_DATA_SOURCE, // SqlState = 'IM002'
+ DB_ERR_DRIVER_LOAD_ERROR, // SqlState = 'IM003'
+ DB_ERR_SQLALLOCENV_FAILED, // SqlState = 'IM004'
+ DB_ERR_SQLALLOCCONNECT_FAILED, // SqlState = 'IM005'
+ DB_ERR_SQLSETCONNECTOPTION_FAILED, // SqlState = 'IM006'
+ DB_ERR_NO_DATA_SOURCE_DLG_PROHIB, // SqlState = 'IM007'
+ DB_ERR_DIALOG_FAILED, // SqlState = 'IM008'
+ DB_ERR_UNABLE_TO_LOAD_TRANSLATION_DLL, // SqlState = 'IM009'
+ DB_ERR_DATA_SOURCE_NAME_TOO_LONG, // SqlState = 'IM010'
+ DB_ERR_DRIVER_NAME_TOO_LONG, // SqlState = 'IM011'
+ DB_ERR_DRIVER_KEYWORD_SYNTAX_ERROR, // SqlState = 'IM012'
+ DB_ERR_TRACE_FILE_ERROR, // SqlState = 'IM013'
+ DB_ERR_TABLE_OR_VIEW_ALREADY_EXISTS, // SqlState = 'S0001'
+ DB_ERR_TABLE_NOT_FOUND, // SqlState = 'S0002'
+ DB_ERR_INDEX_ALREADY_EXISTS, // SqlState = 'S0011'
+ DB_ERR_INDEX_NOT_FOUND, // SqlState = 'S0012'
+ DB_ERR_COLUMN_ALREADY_EXISTS, // SqlState = 'S0021'
+ DB_ERR_COLUMN_NOT_FOUND, // SqlState = 'S0022'
+ DB_ERR_NO_DEFAULT_FOR_COLUMN, // SqlState = 'S0023'
+ DB_ERR_GENERAL_ERROR, // SqlState = 'S1000'
+ DB_ERR_MEMORY_ALLOCATION_FAILURE, // SqlState = 'S1001'
+ DB_ERR_INVALID_COLUMN_NUMBER, // SqlState = 'S1002'
+ DB_ERR_PROGRAM_TYPE_OUT_OF_RANGE, // SqlState = 'S1003'
+ DB_ERR_SQL_DATA_TYPE_OUT_OF_RANGE, // SqlState = 'S1004'
+ DB_ERR_OPERATION_CANCELLED, // SqlState = 'S1008'
+ DB_ERR_INVALID_ARGUMENT_VALUE, // SqlState = 'S1009'
+ DB_ERR_FUNCTION_SEQUENCE_ERROR, // SqlState = 'S1010'
+ DB_ERR_OPERATION_INVALID_AT_THIS_TIME, // SqlState = 'S1011'
+ DB_ERR_INVALID_TRANS_OPERATION_CODE, // SqlState = 'S1012'
+ DB_ERR_NO_CURSOR_NAME_AVAIL, // SqlState = 'S1015'
+ DB_ERR_INVALID_STR_OR_BUF_LEN, // SqlState = 'S1090'
+ DB_ERR_DESCRIPTOR_TYPE_OUT_OF_RANGE, // SqlState = 'S1091'
+ DB_ERR_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1092'
+ DB_ERR_INVALID_PARAM_NO, // SqlState = 'S1093'
+ DB_ERR_INVALID_SCALE_VALUE, // SqlState = 'S1094'
+ DB_ERR_FUNCTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1095'
+ DB_ERR_INF_TYPE_OUT_OF_RANGE, // SqlState = 'S1096'
+ DB_ERR_COLUMN_TYPE_OUT_OF_RANGE, // SqlState = 'S1097'
+ DB_ERR_SCOPE_TYPE_OUT_OF_RANGE, // SqlState = 'S1098'
+ DB_ERR_NULLABLE_TYPE_OUT_OF_RANGE, // SqlState = 'S1099'
+ DB_ERR_UNIQUENESS_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1100'
+ DB_ERR_ACCURACY_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1101'
+ DB_ERR_DIRECTION_OPTION_OUT_OF_RANGE, // SqlState = 'S1103'
+ DB_ERR_INVALID_PRECISION_VALUE, // SqlState = 'S1104'
+ DB_ERR_INVALID_PARAM_TYPE, // SqlState = 'S1105'
+ DB_ERR_FETCH_TYPE_OUT_OF_RANGE, // SqlState = 'S1106'
+ DB_ERR_ROW_VALUE_OUT_OF_RANGE, // SqlState = 'S1107'
+ DB_ERR_CONCURRENCY_OPTION_OUT_OF_RANGE, // SqlState = 'S1108'
+ DB_ERR_INVALID_CURSOR_POSITION, // SqlState = 'S1109'
+ DB_ERR_INVALID_DRIVER_COMPLETION, // SqlState = 'S1110'
+ DB_ERR_INVALID_BOOKMARK_VALUE, // SqlState = 'S1111'
+ DB_ERR_DRIVER_NOT_CAPABLE, // SqlState = 'S1C00'
+ DB_ERR_TIMEOUT_EXPIRED // SqlState = 'S1T00'
+};
+
+#ifndef MAXNAME
+ #define MAXNAME 31
+#endif
+
+#ifndef SQL_MAX_AUTHSTR_LEN
+ // There does not seem to be a standard for this, so I am
+ // defaulting to the value that MS uses
+ #define SQL_MAX_AUTHSTR_LEN MAXNAME
+#endif
+
+#ifndef SQL_MAX_CONNECTSTR_LEN
+ // There does not seem to be a standard for this, so I am
+ // defaulting to the value that MS recommends
+ #define SQL_MAX_CONNECTSTR_LEN 1024
+#endif
+
+
+class WXDLLIMPEXP_ODBC wxDbConnectInf
+{
+ private:
+ bool freeHenvOnDestroy;
+ bool useConnectionStr;
+
+ public:
+ HENV Henv;
+ wxChar Dsn[SQL_MAX_DSN_LENGTH+1]; // Data Source Name
+ wxChar Uid[SQL_MAX_USER_NAME_LEN+1]; // User ID
+ wxChar AuthStr[SQL_MAX_AUTHSTR_LEN+1]; // Authorization string (password)
+ wxChar ConnectionStr[SQL_MAX_CONNECTSTR_LEN+1]; // Connection string (password)
+
+ wxString Description; // Not sure what the max length is
+ wxString FileType; // Not sure what the max length is
+
+ // Optionals needed for some databases like dBase
+ wxString DefaultDir; // Directory that db file resides in
+
+ public:
+
+ wxDbConnectInf();
+ wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID=wxEmptyString,
+ const wxString &password=wxEmptyString, const wxString &defaultDir=wxEmptyString,
+ const wxString &description=wxEmptyString, const wxString &fileType=wxEmptyString);
+
+ ~wxDbConnectInf();
+
+ bool Initialize();
+
+ bool AllocHenv();
+ void FreeHenv();
+
+ // Accessors
+ const HENV &GetHenv() { return Henv; };
+
+ const wxChar *GetDsn() { return Dsn; };
+
+ const wxChar *GetUid() { return Uid; };
+ const wxChar *GetUserID() { return Uid; };
+
+ const wxChar *GetAuthStr() { return AuthStr; };
+ const wxChar *GetPassword() { return AuthStr; };
+
+ const wxChar *GetConnectionStr() { return ConnectionStr; };
+ bool UseConnectionStr() { return useConnectionStr; };
+
+ const wxChar *GetDescription() { return Description; };
+ const wxChar *GetFileType() { return FileType; };
+ const wxChar *GetDefaultDir() { return DefaultDir; };
+
+ void SetHenv(const HENV henv) { Henv = henv; };
+
+ void SetDsn(const wxString &dsn);
+
+ void SetUserID(const wxString &userID);
+ void SetUid(const wxString &uid) { SetUserID(uid); };
+
+ void SetPassword(const wxString &password);
+ void SetAuthStr(const wxString &authstr) { SetPassword(authstr); };
+
+ void SetConnectionStr(const wxString &connectStr);
+
+ void SetDescription(const wxString &desc) { Description = desc; };
+ void SetFileType(const wxString &fileType) { FileType = fileType; };
+ void SetDefaultDir(const wxString &defDir) { DefaultDir = defDir; };
+}; // class wxDbConnectInf
+
+
+struct WXDLLIMPEXP_ODBC wxDbSqlTypeInfo
+{
+ wxString TypeName;
+ SWORD FsqlType;
+ long Precision;
+ short CaseSensitive;
+ short MaximumScale;
+};
+
+
+class WXDLLIMPEXP_ODBC wxDbColFor