852 lines
27 KiB
C++
852 lines
27 KiB
C++
/***************************************************************************/
|
|
/* CATALOG.C */
|
|
/* Copyright (C) 1995-96 SYWARE Inc., All rights reserved */
|
|
/***************************************************************************/
|
|
// Commenting #define out - causing compiler error - not sure if needed, compiles
|
|
// okay without it.
|
|
//#define WINVER 0x0400
|
|
#include "precomp.h"
|
|
|
|
#include "wbemidl.h"
|
|
|
|
#include <comdef.h>
|
|
//smart pointer
|
|
_COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices);
|
|
_COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject);
|
|
//_COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext );
|
|
_COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator);
|
|
|
|
#include "drdbdr.h"
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLTables (
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName,
|
|
UCHAR FAR *szTableType,
|
|
SWORD cbTableType)
|
|
{
|
|
LPSTMT lpstmt;
|
|
SWORD err;
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
/* Get statement handle */
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
MyImpersonator im (lpstmt, "SQLTables");
|
|
|
|
/* Error if in the middle of a statement already */
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
|
|
/* Free previously prepared statement if any */
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
|
|
// There are four different operations you may perform through SQLTables, they are :
|
|
// (1) enumerate types
|
|
// (2) enumerate qualifiers
|
|
// (3) enumerate owners
|
|
// (4) enumerate tables
|
|
|
|
//[1] Enumerate Types
|
|
/* Is user trying to get a list of table types? */
|
|
|
|
if ((TrueSize((LPUSTR)szTableQualifier, cbTableQualifier, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableOwner, cbTableOwner, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableName, cbTableName, MAX_TABLE_NAME_LENGTH) == 0) &&
|
|
((szTableType != NULL) &&
|
|
(cbTableType != SQL_NULL_DATA) &&
|
|
(cbTableType != 0) &&
|
|
(*szTableType == '%') &&
|
|
((cbTableType == 1) ||
|
|
((cbTableType == SQL_NTS) && (szTableType[1] == '\0')))))
|
|
{
|
|
/* Set sub-flag to indicate this */
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_TABLES_TYPES;
|
|
|
|
/* So far no table types have been returned */
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
}
|
|
else if ((TrueSize((LPUSTR)szTableOwner, cbTableOwner, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableName, cbTableName, MAX_TABLE_NAME_LENGTH) == 0) &&
|
|
// (TrueSize((char*)szTableType, cbTableType, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableQualifier, cbTableQualifier, 1) != 0) &&
|
|
((*szTableQualifier == '%') || (szTableQualifier[1] == '\0')) &&
|
|
((cbTableQualifier == 1 ) || (cbTableQualifier == SQL_NTS)))
|
|
{
|
|
//[2] Enumerating Qualifiers
|
|
|
|
/* Set sub-flag to indicate this */
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_TABLES_QUALIFIERS;
|
|
|
|
err = ISAMGetQualifierList(lpstmt->lpdbc->lpISAM, &(lpstmt->lpISAMQualifierList));
|
|
|
|
|
|
if (err != NO_ISAM_ERR)
|
|
{
|
|
lpstmt->lpISAMQualifierList = NULL;
|
|
lpstmt->errcode = err;
|
|
ISAMGetErrorMessage(lpstmt->lpdbc->lpISAM, (LPUSTR)lpstmt->szISAMError);
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
// So far no tables returned
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
lstrcpy((char*)lpstmt->szQualifierName, "");
|
|
}
|
|
else if ((TrueSize((LPUSTR)szTableName, cbTableName, MAX_TABLE_NAME_LENGTH) == 0) &&
|
|
(TrueSize((LPUSTR)szTableType, cbTableType, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableQualifier, cbTableQualifier, 1) == 0) &&
|
|
(TrueSize((LPUSTR)szTableOwner, cbTableOwner, 1) != 0) &&
|
|
(*szTableOwner == '%') &&
|
|
((cbTableOwner == 1) ||
|
|
((cbTableOwner == SQL_NTS) && (szTableOwner[1] == '\0'))))
|
|
|
|
{
|
|
//[3] Enumerating Owners
|
|
|
|
/* Set sub-flag to indicate this */
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_TABLES_OWNERS;
|
|
|
|
// So far no tables returned
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
//[4] Enumerating Tables
|
|
|
|
/* No. Figure out how long szTableName really is */
|
|
cbTableName = (SWORD) TrueSize((LPUSTR)szTableName, cbTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
|
|
/* No. Figure out how long szTableQualifier really is */
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szTableQualifier, cbTableQualifier,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
|
|
LPCSTR szConstqualifier = (char*)szTableQualifier;
|
|
|
|
//If no table qualifier is specified then use the 'current' database
|
|
if (!cbTableQualifier)
|
|
{
|
|
szConstqualifier = (char*) lpstmt->lpdbc->lpISAM->szDatabase;
|
|
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szConstqualifier, SQL_NTS,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
}
|
|
|
|
/* No. Figure out how long szTableType really is */
|
|
if ( (cbTableType == SQL_NTS) && szTableType)
|
|
{
|
|
cbTableType = (SWORD) lstrlen ((char*)szTableType);
|
|
}
|
|
|
|
//if a table type is specified check that we are asking for TABLE or SYSTEM TABLE
|
|
BOOL fWantTables = TRUE;
|
|
BOOL fWantSysTables = FALSE;
|
|
|
|
char* lpTempy = (char*)szTableType;
|
|
if (cbTableType && lpTempy && lstrlen(lpTempy))
|
|
{
|
|
//Find out what permuations of table types you require
|
|
fWantSysTables = PatternMatch(TRUE, (LPUSTR)szTableType, cbTableType, (LPUSTR)"%SYSTEM%TABLE%", SQL_NTS, ISAMCaseSensitive(lpstmt->lpdbc->lpISAM));
|
|
|
|
if (fWantSysTables)
|
|
{
|
|
//We want SYSTEM TABLE. Check if we also want TABLE
|
|
if ( PatternMatch(TRUE, (LPUSTR)szTableType, cbTableType, (LPUSTR)"%TABLE%,%SYSTEM%TABLE%", SQL_NTS, ISAMCaseSensitive(lpstmt->lpdbc->lpISAM)) ||
|
|
PatternMatch(TRUE, (LPUSTR)szTableType, cbTableType, (LPUSTR)"%SYSTEM%TABLE%,%TABLE%", SQL_NTS, ISAMCaseSensitive(lpstmt->lpdbc->lpISAM)) )
|
|
fWantTables = TRUE;
|
|
else
|
|
fWantTables = FALSE;
|
|
}
|
|
else
|
|
{
|
|
//We don't want SYSTEM TABLE. Check if we want TABLE
|
|
fWantTables = PatternMatch(TRUE, (LPUSTR)szTableType, cbTableType, (LPUSTR)"%TABLE%", SQL_NTS, ISAMCaseSensitive(lpstmt->lpdbc->lpISAM));
|
|
}
|
|
}
|
|
|
|
//If we don't want SYSTEM TABLE and TABLE then we don't want any tables
|
|
BOOL fEmptyReq = ( (!fWantTables) && (!fWantSysTables)) ? TRUE :FALSE;
|
|
|
|
/* Get list of tables to return (return all tables if no name given)*/
|
|
if (cbTableName == 0)
|
|
err = ISAMGetTableList(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR) "%", 1, (LPUSTR)szConstqualifier, cbTableQualifier,
|
|
&(lpstmt->lpISAMTableList), fWantSysTables, fEmptyReq);
|
|
else
|
|
err = ISAMGetTableList(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR)szTableName, cbTableName,
|
|
(LPUSTR)szConstqualifier, cbTableQualifier,
|
|
&(lpstmt->lpISAMTableList), fWantSysTables, fEmptyReq);
|
|
|
|
if (err != NO_ISAM_ERR)
|
|
{
|
|
lpstmt->lpISAMTableList = NULL;
|
|
lpstmt->errcode = err;
|
|
ISAMGetErrorMessage(lpstmt->lpdbc->lpISAM, (LPUSTR)
|
|
lpstmt->szISAMError);
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
|
|
/* Set sub-flag to indicate this */
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_TABLES_TABLES;
|
|
|
|
/* So far no tables returned */
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
s_lstrcpy((char*)lpstmt->szTableName, "");
|
|
}
|
|
|
|
/* Set type of table */
|
|
lpstmt->fStmtType = STMT_TYPE_TABLES;
|
|
|
|
/* Count of rows is not available */
|
|
lpstmt->cRowCount = -1;
|
|
|
|
/* So far no column read */
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLColumns(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName,
|
|
UCHAR FAR *szColumnName,
|
|
SWORD cbColumnName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
SWORD err;
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
/* Get statement handle */
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
MyImpersonator im(lpstmt, "SQLColumns");
|
|
|
|
/* Error if in the middle of a statement already */
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/* Free previously prepared statement if any */
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
/* Figure out how long szTableName really is */
|
|
cbTableName = (SWORD) TrueSize((LPUSTR)szTableName, cbTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
/* Figure out how long szTableQualifier really is */
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szTableQualifier, cbTableQualifier,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
|
|
LPCSTR szConstqualifier = (char*)szTableQualifier;
|
|
|
|
//If no table qualifier is specified then use the 'current' database
|
|
if (!cbTableQualifier)
|
|
{
|
|
szConstqualifier = (char*) lpstmt->lpdbc->lpISAM->szDatabase;
|
|
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szConstqualifier, SQL_NTS,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
}
|
|
|
|
/* Get list of tables to return (return all tables if no name given) */
|
|
if (cbTableName == 0)
|
|
err = ISAMGetTableList(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR) "%", 1, (LPUSTR)szConstqualifier, cbTableQualifier,
|
|
&(lpstmt->lpISAMTableList));
|
|
else
|
|
err = ISAMGetTableList(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR)szTableName, cbTableName,
|
|
(LPUSTR)szConstqualifier, cbTableQualifier,
|
|
&(lpstmt->lpISAMTableList));
|
|
if (err != NO_ISAM_ERR) {
|
|
lpstmt->lpISAMTableList = NULL;
|
|
lpstmt->errcode = err;
|
|
ISAMGetErrorMessage(lpstmt->lpdbc->lpISAM, (LPUSTR)lpstmt->szISAMError);
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
|
|
/* Set type of table */
|
|
lpstmt->fStmtType = STMT_TYPE_COLUMNS;
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_NONE;
|
|
|
|
/* Figure out how long szColumnName really is */
|
|
cbColumnName = (SWORD) TrueSize((LPUSTR)szColumnName, cbColumnName,
|
|
MAX_COLUMN_NAME_LENGTH);
|
|
|
|
/* Save column name template (return all columns if no name given) */
|
|
if (cbColumnName != 0) {
|
|
_fmemcpy(lpstmt->szColumnName, szColumnName, cbColumnName);
|
|
lpstmt->szColumnName[cbColumnName] = '\0';
|
|
}
|
|
else {
|
|
s_lstrcpy((char*)lpstmt->szColumnName, "%");
|
|
}
|
|
|
|
/* So far no columns returned */
|
|
s_lstrcpy((char*)lpstmt->szTableName, "");
|
|
lpstmt->lpISAMTableDef = NULL;
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
/* Count of rows is not available */
|
|
lpstmt->cRowCount = -1;
|
|
|
|
/* So far no column read */
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLStatistics(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName,
|
|
UWORD fUnique,
|
|
UWORD fAccuracy)
|
|
{
|
|
/*
|
|
//This function is not supported in OLE MS Driver
|
|
LPSTMT lpstmt;
|
|
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
*/
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
LPSTMT lpstmt;
|
|
UCHAR szTable[MAX_TABLE_NAME_LENGTH+1];
|
|
|
|
// Get statement handle
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
MyImpersonator im (lpstmt, "SQLStatistics");
|
|
|
|
// Error if in the middle of a statement already
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
// Free previously prepared statement if any
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
// Set type of table
|
|
lpstmt->fStmtType = STMT_TYPE_STATISTICS;
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_NONE;
|
|
|
|
|
|
// Figure out how long szTableName really is
|
|
cbTableName = (SWORD) TrueSize((LPUSTR)szTableName, cbTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
/* Figure out how long szTableQualifier really is */
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szTableQualifier, cbTableQualifier,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
|
|
LPSTR szConstqualifier = (char*)szTableQualifier;
|
|
|
|
//If no table qualifier is specified then use the 'current' database
|
|
if (!cbTableQualifier)
|
|
{
|
|
szConstqualifier = (char*) lpstmt->lpdbc->lpISAM->szDatabase;
|
|
|
|
cbTableQualifier = (SWORD) TrueSize((LPUSTR)szConstqualifier, SQL_NTS,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
}
|
|
|
|
|
|
// Open table ofinterst
|
|
_fmemcpy(szTable, szTableName, cbTableName);
|
|
szTable[cbTableName] = '\0';
|
|
if (ISAMOpenTable(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR)szConstqualifier, cbTableQualifier,
|
|
(LPUSTR)szTable, TRUE, &(lpstmt->lpISAMTableDef)) != NO_ISAM_ERR)
|
|
lpstmt->lpISAMTableDef = NULL;
|
|
else if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
|
|
// So far no statistics returned
|
|
s_lstrcpy((char*)lpstmt->szTableName, "");
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
// Count of rows is not available
|
|
lpstmt->cRowCount = -1;
|
|
|
|
// So far no column read
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLTablePrivileges(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLColumnPrivileges(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName,
|
|
UCHAR FAR *szColumnName,
|
|
SWORD cbColumnName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLSpecialColumns(
|
|
HSTMT hstmt,
|
|
UWORD fColType,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName,
|
|
UWORD fScope,
|
|
UWORD fNullable)
|
|
{
|
|
LPSTMT lpstmt;
|
|
UCHAR szTable[MAX_TABLE_NAME_LENGTH+1];
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
/* Get statement handle */
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
MyImpersonator im(lpstmt, "SQLSpecialColumns");
|
|
|
|
/* Error if in the middle of a statement already */
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/* Free previously prepared statement if any */
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
/* Set type of table */
|
|
lpstmt->fStmtType = STMT_TYPE_SPECIALCOLUMNS;
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_NONE;
|
|
|
|
/* What kind of special columns? */
|
|
switch (fColType) {
|
|
case SQL_ROWVER:
|
|
/* Auto update columns (there are none) */
|
|
lpstmt->lpISAMTableDef = NULL;
|
|
break;
|
|
|
|
case SQL_BEST_ROWID:
|
|
/* Key columns for row. Figure out how long szTableName really is */
|
|
cbTableName = (SWORD) TrueSize((LPUSTR)szTableName, cbTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
/* Open table of interst */
|
|
_fmemcpy(szTable, szTableName, cbTableName);
|
|
szTable[cbTableName] = '\0';
|
|
if (ISAMOpenTable(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR)szTableQualifier, cbTableQualifier,
|
|
(LPUSTR)szTable, TRUE,
|
|
&(lpstmt->lpISAMTableDef)) != NO_ISAM_ERR)
|
|
lpstmt->lpISAMTableDef = NULL;
|
|
else if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
break;
|
|
|
|
default:
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/* So far no columns returned */
|
|
s_lstrcpy((char*)lpstmt->szTableName, "");
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
/* Count of rows is not available */
|
|
lpstmt->cRowCount = -1;
|
|
|
|
/* So far no column read */
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLPrimaryKeys(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szTableQualifier,
|
|
SWORD cbTableQualifier,
|
|
UCHAR FAR *szTableOwner,
|
|
SWORD cbTableOwner,
|
|
UCHAR FAR *szTableName,
|
|
SWORD cbTableName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
UCHAR szTable[MAX_TABLE_NAME_LENGTH+1];
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
/* Get statement handle */
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
MyImpersonator im (lpstmt, "SQLPrimaryKeys");
|
|
|
|
/* Error if in the middle of a statement already */
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/* Free previously prepared statement if any */
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
/* Set type of table */
|
|
lpstmt->fStmtType = STMT_TYPE_PRIMARYKEYS;
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_NONE;
|
|
|
|
/* Figure out how long szTableName really is */
|
|
cbTableName = (SWORD) TrueSize(szTableName, cbTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
/* Open table of interst */
|
|
_fmemcpy(szTable, szTableName, cbTableName);
|
|
szTable[cbTableName] = '\0';
|
|
if (ISAMOpenTable(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR)szTableQualifier, cbTableQualifier,
|
|
(LPUSTR) szTable, TRUE,
|
|
&(lpstmt->lpISAMTableDef)) != NO_ISAM_ERR)
|
|
lpstmt->lpISAMTableDef = NULL;
|
|
else if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
|
|
/* So far no columns returned */
|
|
s_lstrcpy(lpstmt->szTableName, "");
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
/* Count of rows is not available */
|
|
lpstmt->cRowCount = -1;
|
|
|
|
/* So far no column read */
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLForeignKeys(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szPkTableQualifier,
|
|
SWORD cbPkTableQualifier,
|
|
UCHAR FAR *szPkTableOwner,
|
|
SWORD cbPkTableOwner,
|
|
UCHAR FAR *szPkTableName,
|
|
SWORD cbPkTableName,
|
|
UCHAR FAR *szFkTableQualifier,
|
|
SWORD cbFkTableQualifier,
|
|
UCHAR FAR *szFkTableOwner,
|
|
SWORD cbFkTableOwner,
|
|
UCHAR FAR *szFkTableName,
|
|
SWORD cbFkTableName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
SWORD err;
|
|
|
|
//To make guarentee Ole is initialized per thread
|
|
COleInitializationManager myOleManager;
|
|
|
|
/* Get statement handle */
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_SUCCESS;
|
|
|
|
|
|
MyImpersonator im (lpstmt, "SQLForeignKeys");
|
|
|
|
/* Error if in the middle of a statement already */
|
|
if (lpstmt->fStmtType != STMT_TYPE_NONE) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->fNeedData) {
|
|
lpstmt->errcode = ERR_CURSORSTATE;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/* Free previously prepared statement if any */
|
|
if (lpstmt->lpSqlStmt != NULL) {
|
|
FreeTree(lpstmt->lpSqlStmt);
|
|
lpstmt->lpSqlStmt = NULL;
|
|
lpstmt->fPreparedSql = FALSE;
|
|
if (lpstmt->lpISAMStatement != NULL) {
|
|
ISAMFreeStatement(lpstmt->lpISAMStatement);
|
|
lpstmt->lpISAMStatement = NULL;
|
|
}
|
|
lpstmt->fNeedData = FALSE;
|
|
lpstmt->idxParameter = NO_SQLNODE;
|
|
lpstmt->cbParameterOffset = -1;
|
|
lpstmt->cRowCount = -1;
|
|
}
|
|
|
|
/* Figure out how long szPkTableName and szFkTableName really are */
|
|
cbPkTableName = (SWORD) TrueSize(szPkTableName, cbPkTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
cbFkTableName = (SWORD) TrueSize(szFkTableName, cbFkTableName,
|
|
MAX_TABLE_NAME_LENGTH);
|
|
|
|
/* Save the tablenames */
|
|
_fmemcpy(lpstmt->szPkTableName, szPkTableName, cbPkTableName);
|
|
lpstmt->szPkTableName[cbPkTableName] = '\0';
|
|
_fmemcpy(lpstmt->szTableName, szFkTableName, cbFkTableName);
|
|
lpstmt->szTableName[cbFkTableName] = '\0';
|
|
|
|
|
|
LPCSTR szConstqualifier = (char*)szPkTableQualifier;
|
|
|
|
//If no table qualifier is specified then use the 'current' database
|
|
if (!cbPkTableQualifier)
|
|
{
|
|
szConstqualifier = (char*) lpstmt->lpdbc->lpISAM->szDatabase;
|
|
|
|
cbFkTableQualifier = (SWORD) TrueSize((LPUSTR)szConstqualifier, SQL_NTS,
|
|
MAX_QUALIFIER_NAME_LENGTH);
|
|
}
|
|
|
|
|
|
/* Get table list if need be */
|
|
if ((cbPkTableName == 0) || (cbFkTableName == 0)) {
|
|
err = ISAMGetTableList(lpstmt->lpdbc->lpISAM,
|
|
(LPUSTR) "%", 1,
|
|
(LPUSTR)szConstqualifier, cbFkTableQualifier,
|
|
&(lpstmt->lpISAMTableList));
|
|
if (err != NO_ISAM_ERR) {
|
|
lpstmt->lpISAMTableList = NULL;
|
|
lpstmt->errcode = err;
|
|
ISAMGetErrorMessage(lpstmt->lpdbc->lpISAM, (LPUSTR)lpstmt->szISAMError);
|
|
return SQL_ERROR;
|
|
}
|
|
if (lpstmt->lpdbc->lpISAM->fSchemaInfoTransactioned)
|
|
lpstmt->fISAMTxnStarted = TRUE;
|
|
}
|
|
|
|
/* So far no primary keys returned */
|
|
lpstmt->irow = BEFORE_FIRST_ROW;
|
|
|
|
/* Set type of table */
|
|
lpstmt->fStmtType = STMT_TYPE_FOREIGNKEYS;
|
|
if (cbPkTableName != 0) {
|
|
if (cbFkTableName != 0)
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_FOREIGNKEYS_SINGLE;
|
|
else
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_FOREIGNKEYS_MULTIPLE_FK_TABLES;
|
|
}
|
|
else {
|
|
lpstmt->fStmtSubtype = STMT_SUBTYPE_FOREIGNKEYS_MULTIPLE_PK_TABLES;
|
|
}
|
|
|
|
/* Count of rows is not available */
|
|
lpstmt->cRowCount = -1;
|
|
|
|
/* So far no column read */
|
|
lpstmt->icol = NO_COLUMN;
|
|
lpstmt->cbOffset = 0;
|
|
|
|
return SQL_SUCCESS;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLProcedures(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szProcQualifier,
|
|
SWORD cbProcQualifier,
|
|
UCHAR FAR *szProcOwner,
|
|
SWORD cbProcOwner,
|
|
UCHAR FAR *szProcName,
|
|
SWORD cbProcName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
RETCODE SQL_API SQLProcedureColumns(
|
|
HSTMT hstmt,
|
|
UCHAR FAR *szProcQualifier,
|
|
SWORD cbProcQualifier,
|
|
UCHAR FAR *szProcOwner,
|
|
SWORD cbProcOwner,
|
|
UCHAR FAR *szProcName,
|
|
SWORD cbProcName,
|
|
UCHAR FAR *szColumnName,
|
|
SWORD cbColumnName)
|
|
{
|
|
LPSTMT lpstmt;
|
|
|
|
lpstmt = (LPSTMT) hstmt;
|
|
lpstmt->errcode = ERR_NOTSUPPORTED;
|
|
return SQL_ERROR;
|
|
}
|
|
|
|
/***************************************************************************/
|