📄 catalog.c
字号:
/* * catalog.c * * $Id: catalog.c,v 1.10 2001/06/04 14:01:25 source Exp $ * * Catalog functions * * The iODBC driver manager. * * Copyright (C) 1995 by Ke Jin <kejin@empress.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <iodbc.h>#include <sql.h>#include <sqlext.h>#include <herr.h>#include <henv.h>#include <hdbc.h>#include <hstmt.h>#include <dlproc.h>#include <itrace.h>/* * Check state for executing catalog functions */static SQLRETURN_iodbcdm_cata_state_ok ( STMT_t FAR * pstmt, int fidx){ int sqlstat = en_00000; if (pstmt->asyn_on == en_NullProc) { switch (pstmt->state) { case en_stmt_needdata: case en_stmt_mustput: case en_stmt_canput: sqlstat = en_S1010; break; case en_stmt_fetched: case en_stmt_xfetched: sqlstat = en_24000; break; default: break; } } else if (pstmt->asyn_on != fidx) { sqlstat = en_S1010; } if (sqlstat != en_00000) { PUSHSQLERR (pstmt->herr, sqlstat); return SQL_ERROR; } return SQL_SUCCESS;}/* * State transition for catalog function */static SQLRETURN_iodbcdm_cata_state_tr ( STMT_t FAR * pstmt, int fidx, SQLRETURN result){ CONN (pdbc, pstmt->hdbc); if (pstmt->asyn_on == fidx) { switch (result) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: case SQL_ERROR: pstmt->asyn_on = en_NullProc; break; case SQL_STILL_EXECUTING: default: return result; } } if (pstmt->state <= en_stmt_executed) { switch (result) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: pstmt->state = en_stmt_cursoropen; break; case SQL_ERROR: pstmt->state = en_stmt_allocated; pstmt->prep_state = 0; break; case SQL_STILL_EXECUTING: pstmt->asyn_on = fidx; break; default: break; } } return result;}SQLRETURN SQL_APISQLGetTypeInfo ( SQLHSTMT hstmt, SQLSMALLINT fSqlType){ STMT (pstmt, hstmt); HPROC hproc = SQL_NULL_HPROC; int sqlstat = en_00000; SQLRETURN retcode; ENTER_STMT (pstmt); for (;;) {#if (ODBCVER < 0x0300) if (fSqlType > SQL_TYPE_MAX) { sqlstat = en_S1004; break; } /* Note: SQL_TYPE_DRIVER_START is a negative number So, we use ">" */ if (fSqlType < SQL_TYPE_MIN && fSqlType > SQL_TYPE_DRIVER_START) { sqlstat = en_S1004; break; }#endif /* ODBCVER < 0x0300 */ retcode = _iodbcdm_cata_state_ok (pstmt, en_GetTypeInfo); if (retcode != SQL_SUCCESS) { LEAVE_STMT (pstmt, SQL_ERROR); } hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetTypeInfo); if (hproc == SQL_NULL_HPROC) { sqlstat = en_IM001; break; } sqlstat = en_00000; if (1) /* turn off solaris warning message */ break; } if (sqlstat != en_00000) { PUSHSQLERR (pstmt->herr, sqlstat); LEAVE_STMT (pstmt, SQL_ERROR); } CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_GetTypeInfo, (pstmt->dhstmt, fSqlType)); retcode = _iodbcdm_cata_state_tr (pstmt, en_GetTypeInfo, retcode); LEAVE_STMT (pstmt, retcode);}SQLRETURN SQL_APISQLSpecialColumns ( SQLHSTMT hstmt, SQLUSMALLINT fColType, SQLCHAR FAR * szTableQualifier, SQLSMALLINT cbTableQualifier, SQLCHAR FAR * szTableOwner, SQLSMALLINT cbTableOwner, SQLCHAR FAR * szTableName, SQLSMALLINT cbTableName, SQLUSMALLINT fScope, SQLUSMALLINT fNullable){ STMT (pstmt, hstmt); HPROC hproc = SQL_NULL_HPROC; SQLRETURN retcode; int sqlstat = en_00000; ENTER_STMT (pstmt); for (;;) { if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS) || (cbTableOwner < 0 && cbTableOwner != SQL_NTS) || (cbTableName < 0 && cbTableName != SQL_NTS)) { sqlstat = en_S1090; break; } if (fColType != SQL_BEST_ROWID && fColType != SQL_ROWVER) { sqlstat = en_S1097; break; } if (fScope != SQL_SCOPE_CURROW && fScope != SQL_SCOPE_TRANSACTION && fScope != SQL_SCOPE_SESSION) { sqlstat = en_S1098; break; } if (fNullable != SQL_NO_NULLS && fNullable != SQL_NULLABLE) { sqlstat = en_S1099; break; } retcode = _iodbcdm_cata_state_ok (pstmt, en_SpecialColumns); if (retcode != SQL_SUCCESS) { LEAVE_STMT (pstmt, SQL_ERROR); } hproc = _iodbcdm_getproc (pstmt->hdbc, en_SpecialColumns); if (hproc == SQL_NULL_HPROC) { sqlstat = en_IM001; break; } sqlstat = en_00000; if (1) /* turn off solaris warning message */ break; } if (sqlstat != en_00000) { PUSHSQLERR (pstmt->herr, sqlstat); LEAVE_STMT (pstmt, SQL_ERROR); } CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_SpecialColumns, ( pstmt->dhstmt, fColType, szTableQualifier, cbTableQualifier, szTableOwner, cbTableOwner, szTableName, cbTableName, fScope, fNullable)); retcode = _iodbcdm_cata_state_tr (pstmt, en_SpecialColumns, retcode); LEAVE_STMT (pstmt, retcode);}SQLRETURN SQL_APISQLStatistics ( SQLHSTMT hstmt, SQLCHAR FAR * szTableQualifier, SQLSMALLINT cbTableQualifier, SQLCHAR FAR * szTableOwner, SQLSMALLINT cbTableOwner, SQLCHAR FAR * szTableName, SQLSMALLINT cbTableName, SQLUSMALLINT fUnique, SQLUSMALLINT fAccuracy){ STMT (pstmt, hstmt); HPROC hproc = SQL_NULL_HPROC; SQLRETURN retcode; int sqlstat = en_00000; ENTER_STMT (pstmt); for (;;) { if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS) || (cbTableOwner < 0 && cbTableOwner != SQL_NTS) || (cbTableName < 0 && cbTableName != SQL_NTS)) { sqlstat = en_S1090; break; } if (fUnique != SQL_INDEX_UNIQUE && fUnique != SQL_INDEX_ALL) { sqlstat = en_S1100; break; } if (fAccuracy != SQL_ENSURE && fAccuracy != SQL_QUICK) { sqlstat = en_S1101; break; } retcode = _iodbcdm_cata_state_ok (pstmt, en_Statistics); if (retcode != SQL_SUCCESS) { LEAVE_STMT (pstmt, SQL_ERROR); } hproc = _iodbcdm_getproc (pstmt->hdbc, en_Statistics); if (hproc == SQL_NULL_HPROC) { sqlstat = en_IM001; break; } sqlstat = en_00000; if (1) /* turn off solaris warning message */ break; } if (sqlstat != en_00000) { PUSHSQLERR (pstmt->herr, sqlstat); LEAVE_STMT (pstmt, SQL_ERROR); } CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_Statistics, ( pstmt->dhstmt, szTableQualifier, cbTableQualifier, szTableOwner, cbTableOwner, szTableName, cbTableName, fUnique, fAccuracy)); retcode = _iodbcdm_cata_state_tr (pstmt, en_Statistics, retcode); LEAVE_STMT (pstmt, retcode);}SQLRETURN SQL_APISQLTables ( SQLHSTMT hstmt, SQLCHAR FAR * szTableQualifier, SQLSMALLINT cbTableQualifier, SQLCHAR FAR * szTableOwner, SQLSMALLINT cbTableOwner, SQLCHAR FAR * szTableName, SQLSMALLINT cbTableName, SQLCHAR FAR * szTableType, SQLSMALLINT cbTableType){ STMT (pstmt, hstmt); HPROC hproc = SQL_NULL_HPROC; SQLRETURN retcode; int sqlstat = en_00000; ENTER_STMT (pstmt); for (;;) { if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS) || (cbTableOwner < 0 && cbTableOwner != SQL_NTS) || (cbTableName < 0 && cbTableName != SQL_NTS) || (cbTableType < 0 && cbTableType != SQL_NTS)) { sqlstat = en_S1090; break; } retcode = _iodbcdm_cata_state_ok (pstmt, en_Tables); if (retcode != SQL_SUCCESS) { LEAVE_STMT (pstmt, SQL_ERROR); } hproc = _iodbcdm_getproc (pstmt->hdbc, en_Tables); if (hproc == SQL_NULL_HPROC) { sqlstat = en_IM001; break; } sqlstat = en_00000; if (1) /* turn off solaris warning message */ break; } if (sqlstat != en_00000) { PUSHSQLERR (pstmt->herr, sqlstat); LEAVE_STMT (pstmt, SQL_ERROR); } CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_Tables, ( pstmt->dhstmt, szTableQualifier, cbTableQualifier, szTableOwner, cbTableOwner, szTableName, cbTableName, szTableType, cbTableType)); retcode = _iodbcdm_cata_state_tr (pstmt, en_Tables, retcode); LEAVE_STMT (pstmt, retcode);}SQLRETURN SQL_APISQLColumnPrivileges ( SQLHSTMT hstmt, SQLCHAR FAR * szTableQualifier, SQLSMALLINT cbTableQualifier, SQLCHAR FAR * szTableOwner, SQLSMALLINT cbTableOwner, SQLCHAR FAR * szTableName, SQLSMALLINT cbTableName, SQLCHAR FAR * szColumnName, SQLSMALLINT cbColumnName){ STMT (pstmt, hstmt); HPROC hproc = SQL_NULL_HPROC; SQLRETURN retcode; int sqlstat = en_00000; ENTER_STMT (pstmt); for (;;) { if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS) || (cbTableOwner < 0 && cbTableOwner != SQL_NTS) || (cbTableName < 0 && cbTableName != SQL_NTS) || (cbColumnName < 0 && cbColumnName != SQL_NTS)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -