00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef CPL_ODBC_H_INCLUDED
00031 #define CPL_ODBC_H_INCLUDED
00032
00033 #include "cpl_port.h"
00034
00035 #ifndef WIN32CE
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)
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
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
00115 int GetUsageCount() const { return m_nUsageCount; }
00116
00117
00118
00119
00120
00121 const char* GetPathOut() const { return m_szPathOut; }
00122
00123
00124
00125
00126
00127 const char* GetLastError() const { return m_szError; }
00128
00129
00130
00131
00132
00133
00134 DWORD GetLastErrorCode() const { return m_nErrorCode; }
00135 };
00136
00137 class CPLODBCStatement;
00138
00139
00140
00141
00142
00143 #if defined(_MSC_VER) && !defined(SQLULEN) && !defined(_WIN64)
00144 # define MISSING_SQLULEN
00145 #endif
00146
00147 #if !defined(MISSING_SQLULEN)
00148
00149 # define _SQLULEN SQLULEN
00150 # define _SQLLEN SQLLEN
00151 #else
00152 # define _SQLULEN SQLUINTEGER
00153 # define _SQLLEN SQLINTEGER
00154 #endif
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
00180
00181 int ClearTransaction();
00182 int BeginTransaction();
00183 int CommitTransaction();
00184 int RollbackTransaction();
00185 int IsInTransaction() { return m_bInTransaction; }
00186
00187
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
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
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
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
00282
00283 #endif
00284
00285