OGR
|
00001 /****************************************************************************** 00002 * $Id: cpl_odbc.h 20579 2010-09-12 11:43:35Z rouault $ 00003 * 00004 * Project: OGR ODBC Driver 00005 * Purpose: Declarations for ODBC Access Cover API. 00006 * Author: Frank Warmerdam, warmerdam@pobox.com 00007 * 00008 ****************************************************************************** 00009 * Copyright (c) 2003, Frank Warmerdam 00010 * 00011 * Permission is hereby granted, free of charge, to any person obtaining a 00012 * copy of this software and associated documentation files (the "Software"), 00013 * to deal in the Software without restriction, including without limitation 00014 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00015 * and/or sell copies of the Software, and to permit persons to whom the 00016 * Software is furnished to do so, subject to the following conditions: 00017 * 00018 * The above copyright notice and this permission notice shall be included 00019 * in all copies or substantial portions of the Software. 00020 * 00021 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00022 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00023 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00024 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00025 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00026 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00027 * DEALINGS IN THE SOFTWARE. 00028 ****************************************************************************/ 00029 00030 #ifndef CPL_ODBC_H_INCLUDED 00031 #define CPL_ODBC_H_INCLUDED 00032 00033 #include "cpl_port.h" 00034 00035 #ifndef WIN32CE /* ODBC is not supported on Windows CE. */ 00036 00037 #ifdef WIN32 00038 # include <windows.h> 00039 #endif 00040 00041 #include <sql.h> 00042 #include <sqlext.h> 00043 #include <odbcinst.h> 00044 #include "cpl_string.h" 00045 00046 #ifdef PATH_MAX 00047 # define ODBC_FILENAME_MAX PATH_MAX 00048 #else 00049 # define ODBC_FILENAME_MAX (255 + 1) /* Max path length */ 00050 #endif 00051 00052 00062 class CPL_DLL CPLODBCDriverInstaller 00063 { 00064 char m_szPathOut[ODBC_FILENAME_MAX]; 00065 char m_szError[SQL_MAX_MESSAGE_LENGTH]; 00066 DWORD m_nErrorCode; 00067 DWORD m_nUsageCount; 00068 00069 public: 00070 00071 // Default constructor. 00072 CPLODBCDriverInstaller(); 00073 00074 00092 int InstallDriver( const char* pszDriver, const char* pszPathIn, 00093 WORD fRequest = ODBC_INSTALL_COMPLETE ); 00094 00111 int RemoveDriver( const char* pszDriverName, int fRemoveDSN = FALSE ); 00112 00113 00114 // The usage count of the driver after this function has been called 00115 int GetUsageCount() const { return m_nUsageCount; } 00116 00117 00118 // Path of the target directory where the driver should be installed. 00119 // For details, see ODBC API Reference and lpszPathOut 00120 // parameter of SQLInstallDriverEx 00121 const char* GetPathOut() const { return m_szPathOut; } 00122 00123 00124 // If InstallDriver returns FALSE, then GetLastError then 00125 // error message can be obtained by calling this function. 00126 // Internally, it calls ODBC's SQLInstallerError function. 00127 const char* GetLastError() const { return m_szError; } 00128 00129 00130 // If InstallDriver returns FALSE, then GetLastErrorCode then 00131 // error code can be obtained by calling this function. 00132 // Internally, it calls ODBC's SQLInstallerError function. 00133 // See ODBC API Reference for possible error flags. 00134 DWORD GetLastErrorCode() const { return m_nErrorCode; } 00135 }; 00136 00137 class CPLODBCStatement; 00138 00139 /* On MSVC SQLULEN is missing in some cases (ie. VC6) 00140 ** but it is always a #define so test this way. On Unix 00141 ** it is a typedef so we can't always do this. 00142 */ 00143 #if defined(_MSC_VER) && !defined(SQLULEN) && !defined(_WIN64) 00144 # define MISSING_SQLULEN 00145 #endif 00146 00147 #if !defined(MISSING_SQLULEN) 00148 /* ODBC types to support 64 bit compilation */ 00149 # define _SQLULEN SQLULEN 00150 # define _SQLLEN SQLLEN 00151 #else 00152 # define _SQLULEN SQLUINTEGER 00153 # define _SQLLEN SQLINTEGER 00154 #endif /* ifdef SQLULEN */ 00155 00156 00163 class CPL_DLL CPLODBCSession { 00164 char m_szLastError[SQL_MAX_MESSAGE_LENGTH + 1]; 00165 HENV m_hEnv; 00166 HDBC m_hDBC; 00167 int m_bInTransaction; 00168 int m_bAutoCommit; 00169 00170 public: 00171 CPLODBCSession(); 00172 ~CPLODBCSession(); 00173 00174 int EstablishSession( const char *pszDSN, 00175 const char *pszUserid, 00176 const char *pszPassword ); 00177 const char *GetLastError(); 00178 00179 // Transaction handling 00180 00181 int ClearTransaction(); 00182 int BeginTransaction(); 00183 int CommitTransaction(); 00184 int RollbackTransaction(); 00185 int IsInTransaction() { return m_bInTransaction; } 00186 00187 // Essentially internal. 00188 00189 int CloseSession(); 00190 00191 int Failed( int, HSTMT = NULL ); 00192 HDBC GetConnection() { return m_hDBC; } 00193 HENV GetEnvironment() { return m_hEnv; } 00194 }; 00195 00205 class CPL_DLL CPLODBCStatement { 00206 00207 CPLODBCSession *m_poSession; 00208 HSTMT m_hStmt; 00209 00210 SQLSMALLINT m_nColCount; 00211 char **m_papszColNames; 00212 SQLSMALLINT *m_panColType; 00213 char **m_papszColTypeNames; 00214 _SQLULEN *m_panColSize; 00215 SQLSMALLINT *m_panColPrecision; 00216 SQLSMALLINT *m_panColNullable; 00217 00218 char **m_papszColValues; 00219 _SQLLEN *m_panColValueLengths; 00220 00221 int Failed( int ); 00222 00223 char *m_pszStatement; 00224 size_t m_nStatementMax; 00225 size_t m_nStatementLen; 00226 00227 public: 00228 CPLODBCStatement( CPLODBCSession * ); 00229 ~CPLODBCStatement(); 00230 00231 HSTMT GetStatement() { return m_hStmt; } 00232 00233 // Command buffer related. 00234 void Clear(); 00235 void AppendEscaped( const char * ); 00236 void Append( const char * ); 00237 void Append( int ); 00238 void Append( double ); 00239 int Appendf( const char *, ... ) CPL_PRINT_FUNC_FORMAT (2, 3); 00240 const char *GetCommand() { return m_pszStatement; } 00241 00242 int ExecuteSQL( const char * = NULL ); 00243 00244 // Results fetching 00245 int Fetch( int nOrientation = SQL_FETCH_NEXT, 00246 int nOffset = 0 ); 00247 void ClearColumnData(); 00248 00249 int GetColCount(); 00250 const char *GetColName( int ); 00251 short GetColType( int ); 00252 const char *GetColTypeName( int ); 00253 short GetColSize( int ); 00254 short GetColPrecision( int ); 00255 short GetColNullable( int ); 00256 00257 int GetColId( const char * ); 00258 const char *GetColData( int, const char * = NULL ); 00259 const char *GetColData( const char *, const char * = NULL ); 00260 int GetColDataLength( int ); 00261 00262 // Fetch special metadata. 00263 int GetColumns( const char *pszTable, 00264 const char *pszCatalog = NULL, 00265 const char *pszSchema = NULL ); 00266 int GetPrimaryKeys( const char *pszTable, 00267 const char *pszCatalog = NULL, 00268 const char *pszSchema = NULL ); 00269 00270 int GetTables( const char *pszCatalog = NULL, 00271 const char *pszSchema = NULL ); 00272 00273 void DumpResult( FILE *fp, int bShowSchema = FALSE ); 00274 00275 static CPLString GetTypeName( int ); 00276 static SQLSMALLINT GetTypeMapping( SQLSMALLINT ); 00277 00278 int CollectResultsInfo(); 00279 }; 00280 00281 #endif /* #ifndef WIN32CE */ 00282 00283 #endif 00284 00285