1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/**********************************************************************
* SQLTables
*
**********************************************************************
*
* This code was created by Peter Harvey (mostly during Christmas 98/99).
* This code is LGPL. Please ensure that this message remains in future
* distributions and uses of this code (thats about all I get out of it).
* - Peter Harvey pharvey@codebydesign.com
*
**********************************************************************/
#include "driver.h"
enum nSQLTables
{
TABLE_CAT = 1,
TABLE_SCHEM,
TABLE_NAME,
TABLE_TYPE,
REMARKS,
COL_MAX
};
m_field aSQLTables[] =
{
"", "", 0, 0, 0, /* keep things 1 based */
"TABLE_CAT", "sys", CHAR_TYPE, 50, 0,
"TABLE_SCHEM", "sys", CHAR_TYPE, 50, 0,
"TABLE_NAME", "sys", CHAR_TYPE, 50, 0,
"TABLE_TYPE", "sys", CHAR_TYPE, 50, 0,
"REMARKS", "sys", CHAR_TYPE, 50, 0
};
SQLRETURN SQLTables( SQLHSTMT hDrvStmt,
SQLCHAR *szCatalogName,
SQLSMALLINT nCatalogNameLength,
SQLCHAR *szSchemaName,
SQLSMALLINT nSchemaNameLength,
SQLCHAR *szTableName,
SQLSMALLINT nTableNameLength,
SQLCHAR *szTableType,
SQLSMALLINT nTableTypeLength )
{
HDRVSTMT hStmt = (HDRVSTMT)hDrvStmt;
m_result *pResults; /* mSQL DATA */
m_field *pField; /* mSQL field */
COLUMNHDR *pColumnHeader;
m_row rowResult; /* mSQL ROW */
int nColumn;
long nResultMemory;
/* SANITY CHECKS */
if( hStmt == SQL_NULL_HSTMT )
return SQL_INVALID_HANDLE;
sprintf( hStmt->szSqlMsg, "hStmt = $%08lX", hStmt );
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, hStmt->szSqlMsg );
/**************************
* close any existing result
**************************/
if ( hStmt->hStmtExtras->aResults )
_FreeResults( hStmt->hStmtExtras );
if ( hStmt->pszQuery != NULL )
free( hStmt->pszQuery );
hStmt->pszQuery = NULL;
/************************
* generate a result set listing tables
************************/
pResults = msqlListTables( ((HDRVDBC)hStmt->hDbc)->hDbcExtras->hServer );
if ( pResults == NULL )
{
sprintf( hStmt->szSqlMsg, "SQL_ERROR Query failed. %s", msqlErrMsg );
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, hStmt->szSqlMsg );
return SQL_ERROR;
}
/**************************
* allocate memory for columns headers and result data (row 0 is column header while col 0 is reserved for bookmarks)
**************************/
hStmt->hStmtExtras->nCols = COL_MAX-1;
hStmt->hStmtExtras->nRows = msqlNumRows( pResults );
hStmt->hStmtExtras->nRow = 0;
nResultMemory = sizeof(char*) * (hStmt->hStmtExtras->nRows+1) * (hStmt->hStmtExtras->nCols+1);
hStmt->hStmtExtras->aResults = malloc( nResultMemory );
if ( hStmt->hStmtExtras->aResults == NULL )
{
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, "Not enough memory. (malloc failed)" );
hStmt->hStmtExtras->nRows = 0;
hStmt->hStmtExtras->nCols = 0;
msqlFreeResult( pResults );
return SQL_ERROR;
}
/**************************
* gather column header information (save col 0 for bookmarks)
**************************/
for ( nColumn = 1; nColumn < COL_MAX; nColumn++ )
{
(hStmt->hStmtExtras->aResults)[nColumn] = malloc( sizeof(COLUMNHDR) );
pColumnHeader = (COLUMNHDR*)(hStmt->hStmtExtras->aResults)[nColumn];
memset( pColumnHeader, 0, sizeof(COLUMNHDR) );
_NativeToSQLColumnHeader( pColumnHeader, &(aSQLTables[nColumn]) );
}
/************************
* gather data (save col 0 for bookmarks)
************************/
hStmt->hStmtExtras->nRow = 0;
while ( (rowResult = msqlFetchRow( pResults )) != NULL )
{
hStmt->hStmtExtras->nRow++;
msqlFieldSeek( pResults, 0 );
for ( nColumn = 1; nColumn <= hStmt->hStmtExtras->nCols; nColumn++ )
{
switch ( nColumn )
{
case TABLE_NAME:
(hStmt->hStmtExtras->aResults)[hStmt->hStmtExtras->nRow*hStmt->hStmtExtras->nCols+nColumn] = (char *)strdup( rowResult[0] );
break;
default:
(hStmt->hStmtExtras->aResults)[hStmt->hStmtExtras->nRow*hStmt->hStmtExtras->nCols+nColumn] = NULL;
}
}
}
hStmt->hStmtExtras->nRow = 0;
/**************************
* free the snapshot
**************************/
msqlFreeResult( pResults );
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_INFO, LOG_INFO, "SQL_SUCCESS" );
return SQL_SUCCESS;
}
|