Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

434 lines
12 KiB

/*++
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 ***********************/