434 lines
12 KiB
C++
434 lines
12 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name :
|
||
|
||
odbcconn.hxx
|
||
|
||
Abstract:
|
||
|
||
This module declares the class ODBC_CONNECTION used for odbc
|
||
connectivity. It also declares the class ODBC_PARAMETER for
|
||
parameter markers used for insertion of data.
|
||
|
||
Author:
|
||
|
||
Murali R. Krishnan ( MuraliK ) 16-Feb-1995
|
||
|
||
Environment:
|
||
|
||
User Mode
|
||
|
||
Project:
|
||
|
||
Internet Services Common DLL
|
||
|
||
Revision History:
|
||
|
||
MuraliK 08-Jan-1995 Split Dynamic Load ODBC module.
|
||
|
||
--*/
|
||
|
||
# ifndef _ODBCCONN_HXX_
|
||
# define _ODBCCONN_HXX_
|
||
|
||
/************************************************************
|
||
* Include Headers
|
||
************************************************************/
|
||
|
||
# include <string.hxx>
|
||
|
||
//
|
||
// SQL-ODBC interface headers
|
||
//
|
||
|
||
# include "sqltypes.h"
|
||
# include "sql.h"
|
||
# include "sqlext.h"
|
||
|
||
|
||
|
||
/************************************************************
|
||
* Dynamic Load support
|
||
************************************************************/
|
||
|
||
extern "C" {
|
||
# include "dynodbc.h"
|
||
};
|
||
|
||
|
||
//
|
||
// Support Old users of LoadODBC
|
||
//
|
||
|
||
inline BOOL
|
||
LoadODBC(VOID)
|
||
{
|
||
return ( DynLoadODBC());
|
||
} // LoadODBC()
|
||
|
||
|
||
|
||
/************************************************************
|
||
* Type Definitions
|
||
************************************************************/
|
||
|
||
/*++
|
||
|
||
class ODBC_PARAMETER
|
||
|
||
This class encapsulates data related to ODBC parameter markers
|
||
to be used for binding purposes.
|
||
|
||
Information about a parameter include:
|
||
|
||
Parameter Number Index of the parameter in the columns of table.
|
||
Parameter Type Indicates direction of data tfr ( In, Out, In/Out)
|
||
C Type Specifies the C Equivalent data struct.
|
||
Sql Type Specifies the SQL Equivalent data struct.
|
||
Precision Gives the precision of the column
|
||
Scale Gives the scale for display of parameter values
|
||
Value Specifies the pointer to memory containing
|
||
the value of the parameter
|
||
MaxCbValue Specifies the maximum bytes of data that can
|
||
be stored in the value buffer
|
||
CbValue Provides a counter for bytes of data used
|
||
up in the binding process.
|
||
--*/
|
||
class ODBC_PARAMETER {
|
||
|
||
public:
|
||
|
||
dllexp ODBC_PARAMETER( IN WORD iParameter,
|
||
IN SWORD fParamType,
|
||
IN SWORD CType,
|
||
IN SWORD sqlType,
|
||
IN UDWORD cbPrecision = 0)
|
||
: m_iParameter ( iParameter),
|
||
m_paramType ( fParamType),
|
||
m_CType ( CType),
|
||
m_SqlType ( sqlType),
|
||
m_cbColPrecision( cbPrecision),
|
||
m_ibScale ( 0),
|
||
m_pValue ( NULL),
|
||
m_cbValue ( 0),
|
||
m_cbValueMax ( 0)
|
||
{}
|
||
|
||
dllexp ~ODBC_PARAMETER( VOID)
|
||
{ if ( m_pValue != NULL) { delete m_pValue; } }
|
||
|
||
|
||
dllexp BOOL
|
||
SetValueBuffer( IN SDWORD cbMaxSize, IN SDWORD cbValue)
|
||
{
|
||
m_pValue = (PTR ) new CHAR[ cbMaxSize]; // pointer to value buffer
|
||
|
||
if ( m_pValue != NULL) {
|
||
|
||
memset( m_pValue, 0, cbMaxSize);
|
||
m_cbValueMax = cbMaxSize; // max size of buffer
|
||
m_cbValue = cbValue; // current effective value
|
||
}
|
||
|
||
return ( m_pValue != NULL);
|
||
} // SetValue()
|
||
|
||
|
||
dllexp BOOL
|
||
CopyValue( IN PVOID pvValue, IN SDWORD cbValue)
|
||
{
|
||
if ( cbValue <= m_cbValueMax) {
|
||
memcpy( m_pValue, pvValue, cbValue);
|
||
} else {
|
||
SetLastError( ERROR_INSUFFICIENT_BUFFER);
|
||
}
|
||
|
||
return ( cbValue <= m_cbValueMax); // return true if we copied.
|
||
} // CopyValue()
|
||
|
||
|
||
dllexp BOOL
|
||
CopyValue( IN LPCSTR pszValue)
|
||
{ // always copy including the null character
|
||
return ( CopyValue( (PVOID ) pszValue, strlen( pszValue) + 1));
|
||
}
|
||
|
||
dllexp BOOL
|
||
CopyValue( IN LPCWSTR pwszValue);
|
||
|
||
dllexp BOOL
|
||
CopyValue( IN LPSYSTEMTIME lpSystemTime);
|
||
|
||
dllexp BOOL
|
||
CopyValue( IN DWORD dwValue)
|
||
{ return ( CopyValue( (PVOID ) &dwValue, sizeof( DWORD))); }
|
||
|
||
|
||
dllexp WORD QueryParamNumber( VOID) const { return ( m_iParameter); }
|
||
dllexp SWORD QueryParamType ( VOID) const { return ( m_paramType); }
|
||
dllexp SWORD QueryCType ( VOID) const { return ( m_CType); }
|
||
dllexp SWORD QuerySqlType ( VOID) const { return ( m_SqlType); }
|
||
dllexp UDWORD QueryPrecision ( VOID) const { return ( m_cbColPrecision); }
|
||
dllexp SWORD QueryScale ( VOID) const { return ( m_ibScale); }
|
||
dllexp PTR QueryValue ( VOID) const { return ( m_pValue); }
|
||
dllexp SDWORD QueryMaxCbValue ( VOID) const { return ( m_cbValueMax); }
|
||
dllexp SDWORD QueryCbValue ( VOID) const { return ( m_cbValue); }
|
||
|
||
dllexp SDWORD &
|
||
QueryCbValueRef( VOID)
|
||
{ return ( m_cbValue); } // return a reference to count of bytes rx.
|
||
|
||
dllexp RETCODE Bind( IN HSTMT hStmt);
|
||
|
||
# if DBG
|
||
|
||
VOID Print( VOID) const;
|
||
|
||
# endif // DBG
|
||
|
||
private:
|
||
|
||
WORD m_iParameter; // index or the parameter number
|
||
SWORD m_paramType; // type of the parameter
|
||
SWORD m_CType; // the C data type for this parameter
|
||
SWORD m_SqlType; // the SQL data type for this parameter
|
||
UDWORD m_cbColPrecision; // precision of the column
|
||
SWORD m_ibScale; // scale of the column
|
||
PTR m_pValue; // pointer to the value.
|
||
SDWORD m_cbValueMax; // max bytes allowed in pValue.
|
||
SDWORD m_cbValue; // count of bytes of value
|
||
|
||
}; // class ODBC_PARAMETER
|
||
|
||
|
||
typedef ODBC_PARAMETER * PODBC_PARAMETER;
|
||
|
||
|
||
|
||
|
||
//
|
||
// Forwards Declaration
|
||
//
|
||
class ODBC_CONNECTION;
|
||
|
||
|
||
/*++
|
||
|
||
class ODBC_STATEMENT:
|
||
|
||
This class declares an interface for statements using ODBC connection.
|
||
|
||
m_hstmt Statement used for execution.
|
||
m_rc Return code for last ODBC call.
|
||
m_fPreparedStmt is the statement prepared.
|
||
|
||
--*/
|
||
class ODBC_STATEMENT {
|
||
|
||
public:
|
||
ODBC_STATEMENT( IN ODBC_CONNECTION * pOdbcConnection,
|
||
IN HSTMT hStmt)
|
||
: m_hStmt ( hStmt),
|
||
m_pOdbcConnection( pOdbcConnection),
|
||
m_fPreparedStmt ( FALSE),
|
||
m_rc ( SQL_SUCCESS),
|
||
m_astrColNames ( NULL ),
|
||
m_astrValues ( NULL ),
|
||
m_acbValue ( NULL ),
|
||
m_cCols ( 0 )
|
||
{}
|
||
|
||
dllexp ~ODBC_STATEMENT( VOID);
|
||
|
||
dllexp RETCODE QueryErrorCode( VOID) const { return ( m_rc); }
|
||
dllexp BOOL IsValid( VOID) const { return ( m_fPreparedStmt);}
|
||
|
||
dllexp BOOL PrepareStatement( IN LPCSTR pszStatement);
|
||
dllexp BOOL PrepareStatement( IN LPCWSTR pwszStatement);
|
||
dllexp BOOL BindParameter( IN PODBC_PARAMETER pOdbcParam);
|
||
dllexp BOOL ExecuteStatement( VOID); // Executes the prepared statement.
|
||
dllexp BOOL ExecDirect( IN LPCSTR pszSqlCommand, IN DWORD cchSqlCommand);
|
||
dllexp BOOL ExecDirect( IN LPCWSTR pszSqlCommand, IN DWORD cchSqlCommand);
|
||
|
||
dllexp BOOL QueryRowCount( OUT DWORD * pRows );
|
||
|
||
inline BOOL GetLastErrorText( OUT STR * pstrError );
|
||
inline BOOL GetLastErrorTextAsHtml( OUT STR * pstrError );
|
||
|
||
//
|
||
// These allocate an array (0 to cCols-1) containing the row name of
|
||
// the result column and the string value of the current position in
|
||
// the result set. Each successive call to QueryValuesAsStr gets the next
|
||
// row in the result set.
|
||
//
|
||
|
||
dllexp BOOL QueryColNames( OUT STR * * apstrCols,
|
||
OUT DWORD * cCols,
|
||
IN DWORD cchMaxFieldSize,
|
||
OUT BOOL * pfIsSelect );
|
||
dllexp BOOL QueryValuesAsStr( OUT STR * * apstrValues,
|
||
OUT DWORD * * apcbValues,
|
||
OUT BOOL * pfLast );
|
||
|
||
|
||
dllexp BOOL MoreResults( BOOL * pfMoreResults );
|
||
|
||
# if DBG
|
||
|
||
VOID Print( VOID) const;
|
||
# endif // DBG
|
||
|
||
dllexp VOID FreeColumnMemory( VOID );
|
||
|
||
private:
|
||
|
||
// DATA
|
||
|
||
ODBC_CONNECTION * m_pOdbcConnection; // back pointer to connection
|
||
|
||
BOOL m_fPreparedStmt; // set after stmt is prepared.
|
||
HSTMT m_hStmt;
|
||
RETCODE m_rc;
|
||
|
||
//
|
||
// Contains buffers used by QueryColNames and QueryValuesAsStr
|
||
//
|
||
|
||
WORD m_cCols;
|
||
STR * m_astrColNames;
|
||
STR * m_astrValues; // Memory for destination of fetched data
|
||
LONG * m_acbValue;
|
||
// Array of byte counts of data placed in m_astrValues
|
||
|
||
|
||
}; // ODBC_STATEMENT()
|
||
|
||
typedef ODBC_STATEMENT * PODBC_STATEMENT;
|
||
|
||
|
||
|
||
|
||
|
||
/*++
|
||
|
||
class ODBC_CONNECTION:
|
||
|
||
This class specifies a logical class to contain the ODBC nuances
|
||
and encapsulates relevant data for using ODBC to talk to a
|
||
database system.
|
||
|
||
Data encapsulated includes:
|
||
m_henv Environment handle for ODBC connection.
|
||
m_hdbc Database connection handle.
|
||
m_rc Return code for last ODBC call.
|
||
|
||
--*/
|
||
class ODBC_CONNECTION {
|
||
|
||
public:
|
||
|
||
|
||
dllexp ODBC_CONNECTION( VOID)
|
||
: m_henv ( SQL_NULL_HENV),
|
||
m_hdbc ( SQL_NULL_HDBC),
|
||
m_fValid ( FALSE),
|
||
m_rc ( SQL_SUCCESS)
|
||
{ }
|
||
|
||
dllexp ~ODBC_CONNECTION( VOID);
|
||
|
||
//
|
||
// Returns the text for the last error that occurred
|
||
//
|
||
|
||
dllexp BOOL GetLastErrorText( OUT STR * pstrError,
|
||
IN HSTMT hstmt = SQL_NULL_HSTMT,
|
||
IN RETCODE rc = SQL_SUCCESS ) const;
|
||
|
||
dllexp BOOL GetLastErrorTextAsHtml( OUT STR * pstrError,
|
||
IN HSTMT hstmt = SQL_NULL_HSTMT,
|
||
IN RETCODE rc = SQL_SUCCESS ) const;
|
||
|
||
dllexp static BOOL Success( IN RETCODE rc)
|
||
{ return ( ( rc == SQL_SUCCESS) || ( rc == SQL_SUCCESS_WITH_INFO)); }
|
||
|
||
dllexp BOOL IsValid( VOID) const { return ( m_fValid); }
|
||
dllexp RETCODE QueryErrorCode( VOID) const { return ( m_rc); }
|
||
|
||
dllexp BOOL Open(
|
||
IN LPCSTR pszDataSource,
|
||
IN LPCSTR pszUserName,
|
||
IN LPCSTR pszPassword);
|
||
|
||
dllexp BOOL Open(
|
||
IN LPCWSTR pwszDataSource,
|
||
IN LPCWSTR pwszUserName,
|
||
IN LPCWSTR pwszPassword);
|
||
|
||
dllexp BOOL Close( VOID);
|
||
|
||
dllexp PODBC_STATEMENT AllocStatement( VOID);
|
||
|
||
dllexp BOOL SetConnectOption( IN UWORD Option,
|
||
IN SQLPOINTER Param);
|
||
|
||
dllexp BOOL GetInfo( IN DWORD fInfoType,
|
||
IN PVOID rgbInfoValue,
|
||
IN DWORD cbInfoValueMax,
|
||
IN OUT DWORD * pcbInfoValue);
|
||
|
||
dllexp static DWORD DisplaySize( SWORD ColType, DWORD cchColLength );
|
||
|
||
|
||
# if DBG
|
||
|
||
VOID Print( VOID) const;
|
||
# endif // DBG
|
||
|
||
|
||
private:
|
||
|
||
|
||
//
|
||
// ODBC specific data members.
|
||
//
|
||
HENV m_henv;
|
||
HDBC m_hdbc;
|
||
RETCODE m_rc;
|
||
BOOL m_fValid;
|
||
|
||
}; // ODBC_CONNECTION
|
||
|
||
|
||
typedef ODBC_CONNECTION * PODBC_CONNECTION;
|
||
|
||
|
||
|
||
/************************************************************
|
||
* Inline Functions
|
||
************************************************************/
|
||
|
||
inline BOOL ODBC_STATEMENT::GetLastErrorText( OUT STR * pstrError )
|
||
{
|
||
return ( m_pOdbcConnection->GetLastErrorText( pstrError,
|
||
m_hStmt,
|
||
m_rc ));
|
||
} // ODBC_STATEMENT::GetLastErrorText()
|
||
|
||
inline BOOL ODBC_STATEMENT::GetLastErrorTextAsHtml( OUT STR * pstrError )
|
||
{
|
||
return ( m_pOdbcConnection->GetLastErrorTextAsHtml( pstrError,
|
||
m_hStmt,
|
||
m_rc ));
|
||
} // ODBC_STATEMENT::GetLastErrorText()
|
||
|
||
|
||
|
||
|
||
# endif // _ODBCCONN_HXX_
|
||
|
||
/************************ End of File ***********************/
|
||
|
||
|