summaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/windev/odbcapi30.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/windev/odbcapi30.c')
-rw-r--r--src/interfaces/odbc/windev/odbcapi30.c752
1 files changed, 752 insertions, 0 deletions
diff --git a/src/interfaces/odbc/windev/odbcapi30.c b/src/interfaces/odbc/windev/odbcapi30.c
new file mode 100644
index 00000000000..8ad1dba7e6f
--- /dev/null
+++ b/src/interfaces/odbc/windev/odbcapi30.c
@@ -0,0 +1,752 @@
+/*-------
+ * Module: odbcapi30.c
+ *
+ * Description: This module contains routines related to ODBC 3.0
+ * most of their implementations are temporary
+ * and must be rewritten properly.
+ * 2001/07/23 inoue
+ *
+ * Classes: n/a
+ *
+ * API functions: SQLAllocHandle, SQLBindParam, SQLCloseCursor,
+ SQLColAttribute, SQLCopyDesc, SQLEndTran,
+ SQLFetchScroll, SQLFreeHandle, SQLGetDescField,
+ SQLGetDescRec, SQLGetDiagField, SQLGetDiagRec,
+ SQLGetEnvAttr, SQLGetConnectAttr, SQLGetStmtAttr,
+ SQLSetConnectAttr, SQLSetDescField, SQLSetDescRec,
+ SQLSetEnvAttr, SQLSetStmtAttr, SQLBulkOperations
+ *-------
+ */
+
+#ifndef ODBCVER
+#define ODBCVER 0x0300
+#endif
+#include "psqlodbc.h"
+#include <stdio.h>
+#include <string.h>
+
+#include "environ.h"
+#include "connection.h"
+#include "statement.h"
+#include "pgapifunc.h"
+
+/* SQLAllocConnect/SQLAllocEnv/SQLAllocStmt -> SQLAllocHandle */
+RETCODE SQL_API
+SQLAllocHandle(SQLSMALLINT HandleType,
+ SQLHANDLE InputHandle, SQLHANDLE * OutputHandle)
+{
+ mylog("[[SQLAllocHandle]]");
+ switch (HandleType)
+ {
+ case SQL_HANDLE_ENV:
+ return PGAPI_AllocEnv(OutputHandle);
+ case SQL_HANDLE_DBC:
+ return PGAPI_AllocConnect(InputHandle, OutputHandle);
+ case SQL_HANDLE_STMT:
+ return PGAPI_AllocStmt(InputHandle, OutputHandle);
+ default:
+ break;
+ }
+ return SQL_ERROR;
+}
+
+/* SQLBindParameter/SQLSetParam -> SQLBindParam */
+RETCODE SQL_API
+SQLBindParam(HSTMT StatementHandle,
+ SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType,
+ SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision,
+ SQLSMALLINT ParameterScale, PTR ParameterValue,
+ SQLINTEGER *StrLen_or_Ind)
+{
+ int BufferLength = 512; /* Is it OK ? */
+
+ mylog("[[SQLBindParam]]");
+ return PGAPI_BindParameter(StatementHandle, ParameterNumber, SQL_PARAM_INPUT, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValue, BufferLength, StrLen_or_Ind);
+}
+
+/* New function */
+RETCODE SQL_API
+SQLCloseCursor(HSTMT StatementHandle)
+{
+ mylog("[[SQLCloseCursor]]");
+ return PGAPI_FreeStmt(StatementHandle, SQL_CLOSE);
+}
+
+/* SQLColAttributes -> SQLColAttribute */
+RETCODE SQL_API
+SQLColAttribute(HSTMT StatementHandle,
+ SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier,
+ PTR CharacterAttribute, SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength, PTR NumericAttribute)
+{
+ mylog("[[SQLColAttribute]]");
+ return PGAPI_ColAttributes(StatementHandle, ColumnNumber,
+ FieldIdentifier, CharacterAttribute, BufferLength,
+ StringLength, NumericAttribute);
+}
+
+/* new function */
+RETCODE SQL_API
+SQLCopyDesc(SQLHDESC SourceDescHandle,
+ SQLHDESC TargetDescHandle)
+{
+ mylog("[[SQLCopyDesc]]\n");
+ return SQL_ERROR;
+}
+
+/* SQLTransact -> SQLEndTran */
+RETCODE SQL_API
+SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle,
+ SQLSMALLINT CompletionType)
+{
+ mylog("[[SQLEndTran]]");
+ switch (HandleType)
+ {
+ case SQL_HANDLE_ENV:
+ return PGAPI_Transact(Handle, SQL_NULL_HDBC, CompletionType);
+ case SQL_HANDLE_DBC:
+ return PGAPI_Transact(SQL_NULL_HENV, Handle, CompletionType);
+ default:
+ break;
+ }
+ return SQL_ERROR; /* SQLSTATE HY092 ("Invalid
+ * attribute/option identifier") */
+
+}
+
+/* SQLExtendedFetch -> SQLFetchScroll */
+RETCODE SQL_API
+SQLFetchScroll(HSTMT StatementHandle,
+ SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset)
+{
+ static char *func = "SQLFetchScroll";
+ StatementClass *stmt = (StatementClass *) StatementHandle;
+ RETCODE ret;
+ SQLUSMALLINT *rowStatusArray = stmt->options.rowStatusArray;
+ SQLINTEGER *pcRow = stmt->options.rowsFetched;
+
+ mylog("[[%s]] %d,%d\n", func, FetchOrientation, FetchOffset);
+ if (FetchOrientation == SQL_FETCH_BOOKMARK)
+ {
+ if (stmt->options.bookmark_ptr)
+ FetchOffset += *((Int4 *) stmt->options.bookmark_ptr);
+ else
+ {
+ stmt->errornumber = STMT_SEQUENCE_ERROR;
+ stmt->errormsg = "Bookmark isn't specifed yet";
+ SC_log_error(func, "", stmt);
+ return SQL_ERROR;
+ }
+ }
+ ret = PGAPI_ExtendedFetch(StatementHandle, FetchOrientation, FetchOffset,
+ pcRow, rowStatusArray);
+ if (ret != SQL_SUCCESS)
+ mylog("%s return = %d\n", func, ret);
+ return ret;
+}
+
+/* SQLFree(Connect/Env/Stmt) -> SQLFreeHandle */
+RETCODE SQL_API
+SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle)
+{
+ mylog("[[SQLFreeHandle]]");
+ switch (HandleType)
+ {
+ case SQL_HANDLE_ENV:
+ return PGAPI_FreeEnv(Handle);
+ case SQL_HANDLE_DBC:
+ return PGAPI_FreeConnect(Handle);
+ case SQL_HANDLE_STMT:
+ return PGAPI_FreeStmt(Handle, SQL_DROP);
+ default:
+ break;
+ }
+ return SQL_ERROR;
+}
+
+/* new function */
+RETCODE SQL_API
+SQLGetDescField(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier,
+ PTR Value, SQLINTEGER BufferLength,
+ SQLINTEGER *StringLength)
+{
+ mylog("[[SQLGetDescField]]\n");
+ return SQL_ERROR;
+}
+
+/* new function */
+RETCODE SQL_API
+SQLGetDescRec(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLCHAR *Name,
+ SQLSMALLINT BufferLength, SQLSMALLINT *StringLength,
+ SQLSMALLINT *Type, SQLSMALLINT *SubType,
+ SQLINTEGER *Length, SQLSMALLINT *Precision,
+ SQLSMALLINT *Scale, SQLSMALLINT *Nullable)
+{
+ mylog("[[SQLGetDescRec]]\n");
+ return SQL_ERROR;
+}
+
+/* new function */
+RETCODE SQL_API
+SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
+ SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier,
+ PTR DiagInfo, SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength)
+{
+ mylog("[[SQLGetDiagField]]\n");
+ return SQL_ERROR;
+}
+
+/* SQLError -> SQLDiagRec */
+RETCODE SQL_API
+SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle,
+ SQLSMALLINT RecNumber, SQLCHAR *Sqlstate,
+ SQLINTEGER *NativeError, SQLCHAR *MessageText,
+ SQLSMALLINT BufferLength, SQLSMALLINT *TextLength)
+{
+ RETCODE ret;
+
+ mylog("[[SQLGetDiagRec]]\n");
+ switch (HandleType)
+ {
+ case SQL_HANDLE_ENV:
+ ret = PGAPI_Error(Handle, NULL, NULL, Sqlstate, NativeError,
+ MessageText, BufferLength, TextLength);
+ break;
+ case SQL_HANDLE_DBC:
+ ret = PGAPI_Error(NULL, Handle, NULL, Sqlstate, NativeError,
+ MessageText, BufferLength, TextLength);
+ break;
+ case SQL_HANDLE_STMT:
+ ret = PGAPI_Error(NULL, NULL, Handle, Sqlstate, NativeError,
+ MessageText, BufferLength, TextLength);
+ break;
+ default:
+ ret = SQL_ERROR;
+ }
+ if (ret == SQL_SUCCESS_WITH_INFO &&
+ BufferLength == 0 &&
+ *TextLength)
+ {
+ SQLSMALLINT BufferLength = *TextLength + 4;
+ SQLCHAR *MessageText = malloc(BufferLength);
+
+ ret = SQLGetDiagRec(HandleType, Handle, RecNumber, Sqlstate,
+ NativeError, MessageText, BufferLength,
+ TextLength);
+ free(MessageText);
+ }
+ return ret;
+}
+
+/* new function */
+RETCODE SQL_API
+SQLGetEnvAttr(HENV EnvironmentHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER BufferLength, SQLINTEGER *StringLength)
+{
+ EnvironmentClass *env = (EnvironmentClass *) EnvironmentHandle;
+
+ mylog("[[SQLGetEnvAttr]] %d\n", Attribute);
+ switch (Attribute)
+ {
+ case SQL_ATTR_CONNECTION_POOLING:
+ *((unsigned int *) Value) = SQL_CP_OFF;
+ break;
+ case SQL_ATTR_CP_MATCH:
+ *((unsigned int *) Value) = SQL_CP_RELAXED_MATCH;
+ break;
+ case SQL_ATTR_ODBC_VERSION:
+ *((unsigned int *) Value) = SQL_OV_ODBC3;
+ break;
+ case SQL_ATTR_OUTPUT_NTS:
+ *((unsigned int *) Value) = SQL_TRUE;
+ break;
+ default:
+ env->errornumber = CONN_INVALID_ARGUMENT_NO;
+ return SQL_ERROR;
+ }
+ return SQL_SUCCESS;
+}
+
+/* SQLGetConnectOption -> SQLGetconnectAttr */
+RETCODE SQL_API
+SQLGetConnectAttr(HDBC ConnectionHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER BufferLength, SQLINTEGER *StringLength)
+{
+ ConnectionClass *conn = (ConnectionClass *) ConnectionHandle;
+
+ mylog("[[SQLGetConnectAttr]] %d\n", Attribute);
+ switch (Attribute)
+ {
+ case SQL_ATTR_ASYNC_ENABLE:
+ case SQL_ATTR_AUTO_IPD:
+ case SQL_ATTR_CONNECTION_DEAD:
+ case SQL_ATTR_CONNECTION_TIMEOUT:
+ case SQL_ATTR_METADATA_ID:
+ conn->errornumber = STMT_INVALID_OPTION_IDENTIFIER;
+ conn->errormsg = "Unsupported connection option (Set)";
+ return SQL_ERROR;
+ }
+ return PGAPI_GetConnectOption(ConnectionHandle, (UWORD) Attribute, Value);
+}
+
+/* SQLGetStmtOption -> SQLGetStmtAttr */
+RETCODE SQL_API
+SQLGetStmtAttr(HSTMT StatementHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER BufferLength, SQLINTEGER *StringLength)
+{
+ static char *func = "SQLGetStmtAttr";
+ StatementClass *stmt = (StatementClass *) StatementHandle;
+ RETCODE ret = SQL_SUCCESS;
+ int len = 0;
+
+ mylog("[[%s]] %d\n", func, Attribute);
+ switch (Attribute)
+ {
+ case SQL_ATTR_FETCH_BOOKMARK_PTR: /* 16 */
+ Value = stmt->options.bookmark_ptr;
+
+ len = 4;
+ break;
+ case SQL_ATTR_ROW_STATUS_PTR: /* 25 */
+ Value = stmt->options.rowStatusArray;
+
+ len = 4;
+ break;
+ case SQL_ATTR_ROWS_FETCHED_PTR: /* 26 */
+ Value = stmt->options.rowsFetched;
+
+ len = 4;
+ break;
+ case SQL_ATTR_ROW_ARRAY_SIZE: /* 27 */
+ *((SQLUINTEGER *) Value) = stmt->options.rowset_size;
+ len = 4;
+ break;
+ case SQL_ATTR_APP_ROW_DESC: /* 10010 */
+ *((HSTMT *) Value) = StatementHandle; /* this is useless */
+ len = 4;
+ break;
+ case SQL_ATTR_APP_PARAM_DESC: /* 10011 */
+ *((HSTMT *) Value) = StatementHandle; /* this is useless */
+ len = 4;
+ break;
+ case SQL_ATTR_IMP_ROW_DESC: /* 10012 */
+ *((HSTMT *) Value) = StatementHandle; /* this is useless */
+ len = 4;
+ break;
+ case SQL_ATTR_IMP_PARAM_DESC: /* 10013 */
+ *((HSTMT *) Value) = StatementHandle; /* this is useless */
+ len = 4;
+ break;
+ case SQL_ATTR_AUTO_IPD: /* 10001 */
+ /* case SQL_ATTR_ROW_BIND_TYPE: ** == SQL_BIND_TYPE(ODBC2.0) */
+ case SQL_ATTR_PARAMSET_SIZE: /* 22 */
+ case SQL_ATTR_PARAM_STATUS_PTR: /* 20 */
+ case SQL_ATTR_PARAMS_PROCESSED_PTR: /* 21 */
+
+ case SQL_ATTR_CURSOR_SCROLLABLE: /* -1 */
+ case SQL_ATTR_CURSOR_SENSITIVITY: /* -2 */
+
+ case SQL_ATTR_ENABLE_AUTO_IPD: /* 15 */
+ case SQL_ATTR_METADATA_ID: /* 10014 */
+
+ /*
+ * case SQL_ATTR_PREDICATE_PTR: case
+ * SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR:
+ */
+ case SQL_ATTR_PARAM_BIND_OFFSET_PTR: /* 17 */
+ case SQL_ATTR_PARAM_BIND_TYPE: /* 18 */
+ case SQL_ATTR_PARAM_OPERATION_PTR: /* 19 */
+ case SQL_ATTR_ROW_BIND_OFFSET_PTR: /* 23 */
+ case SQL_ATTR_ROW_OPERATION_PTR: /* 24 */
+ stmt->errornumber = STMT_INVALID_OPTION_IDENTIFIER;
+ stmt->errormsg = "Unsupported statement option (Get)";
+ SC_log_error(func, "", stmt);
+ return SQL_ERROR;
+ default:
+ len = 4;
+ ret = PGAPI_GetStmtOption(StatementHandle, (UWORD) Attribute, Value);
+ }
+ if (ret == SQL_SUCCESS && StringLength)
+ *StringLength = len;
+ return ret;
+}
+
+/* SQLSetConnectOption -> SQLSetConnectAttr */
+RETCODE SQL_API
+SQLSetConnectAttr(HDBC ConnectionHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER StringLength)
+{
+ ConnectionClass *conn = (ConnectionClass *) ConnectionHandle;
+
+ mylog("[[SQLSetConnectAttr]] %d\n", Attribute);
+ switch (Attribute)
+ {
+ case SQL_ATTR_ASYNC_ENABLE:
+ case SQL_ATTR_AUTO_IPD:
+ case SQL_ATTR_CONNECTION_DEAD:
+ case SQL_ATTR_CONNECTION_TIMEOUT:
+ case SQL_ATTR_METADATA_ID:
+ conn->errornumber = STMT_INVALID_OPTION_IDENTIFIER;
+ conn->errormsg = "Unsupported connection option (Set)";
+ return SQL_ERROR;
+ }
+ return PGAPI_SetConnectOption(ConnectionHandle, (UWORD) Attribute, (UDWORD) Value);
+}
+
+/* new function */
+RETCODE SQL_API
+SQLSetDescField(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier,
+ PTR Value, SQLINTEGER BufferLength)
+{
+ mylog("[[SQLSetDescField]]\n");
+ return SQL_ERROR;
+}
+
+/* new fucntion */
+RETCODE SQL_API
+SQLSetDescRec(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLSMALLINT Type,
+ SQLSMALLINT SubType, SQLINTEGER Length,
+ SQLSMALLINT Precision, SQLSMALLINT Scale,
+ PTR Data, SQLINTEGER *StringLength,
+ SQLINTEGER *Indicator)
+{
+ mylog("[[SQLsetDescRec]]\n");
+ return SQL_ERROR;
+}
+
+/* new function */
+RETCODE SQL_API
+SQLSetEnvAttr(HENV EnvironmentHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER StringLength)
+{
+ EnvironmentClass *env = (EnvironmentClass *) EnvironmentHandle;
+
+ mylog("[[SQLSetEnvAttr]] att=%d,%u\n", Attribute, Value);
+ switch (Attribute)
+ {
+ case SQL_ATTR_CONNECTION_POOLING:
+ if ((SQLUINTEGER) Value == SQL_CP_OFF)
+ return SQL_SUCCESS;
+ break;
+ case SQL_ATTR_CP_MATCH:
+ /* *((unsigned int *) Value) = SQL_CP_RELAXED_MATCH; */
+ return SQL_SUCCESS;
+ case SQL_ATTR_ODBC_VERSION:
+ if ((SQLUINTEGER) Value == SQL_OV_ODBC2)
+ return SQL_SUCCESS;
+ break;
+ case SQL_ATTR_OUTPUT_NTS:
+ if ((SQLUINTEGER) Value == SQL_TRUE)
+ return SQL_SUCCESS;
+ break;
+ default:
+ env->errornumber = CONN_INVALID_ARGUMENT_NO;
+ return SQL_ERROR;
+ }
+ env->errornumber = CONN_OPTION_VALUE_CHANGED;
+ env->errormsg = "SetEnv changed to ";
+ return SQL_SUCCESS_WITH_INFO;
+}
+
+/* SQLSet(Param/Scroll/Stmt)Option -> SQLSetStmtAttr */
+RETCODE SQL_API
+SQLSetStmtAttr(HSTMT StatementHandle,
+ SQLINTEGER Attribute, PTR Value,
+ SQLINTEGER StringLength)
+{
+ static char *func = "SQLSetStmtAttr";
+ StatementClass *stmt = (StatementClass *) StatementHandle;
+ UDWORD rowcount;
+
+ mylog("[[%s]] %d,%u\n", func, Attribute, Value);
+ switch (Attribute)
+ {
+ case SQL_ATTR_PARAMSET_SIZE: /* 22 */
+ return PGAPI_ParamOptions(StatementHandle, (UWORD) Value, &rowcount);
+ case SQL_ATTR_PARAM_STATUS_PTR: /* 20 */
+ case SQL_ATTR_PARAMS_PROCESSED_PTR: /* 21 */
+
+ case SQL_ATTR_CURSOR_SCROLLABLE: /* -1 */
+ case SQL_ATTR_CURSOR_SENSITIVITY: /* -2 */
+
+ case SQL_ATTR_ENABLE_AUTO_IPD: /* 15 */
+
+ case SQL_ATTR_APP_ROW_DESC: /* 10010 */
+ case SQL_ATTR_APP_PARAM_DESC: /* 10011 */
+ case SQL_ATTR_AUTO_IPD: /* 10001 */
+ /* case SQL_ATTR_ROW_BIND_TYPE: ** == SQL_BIND_TYPE(ODBC2.0) */
+ case SQL_ATTR_IMP_ROW_DESC: /* 10012 */
+ case SQL_ATTR_IMP_PARAM_DESC: /* 10013 */
+ case SQL_ATTR_METADATA_ID: /* 10014 */
+
+ /*
+ * case SQL_ATTR_PREDICATE_PTR: case
+ * SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR:
+ */
+ case SQL_ATTR_PARAM_BIND_OFFSET_PTR: /* 17 */
+ case SQL_ATTR_PARAM_BIND_TYPE: /* 18 */
+ case SQL_ATTR_PARAM_OPERATION_PTR: /* 19 */
+ case SQL_ATTR_ROW_BIND_OFFSET_PTR: /* 23 */
+ case SQL_ATTR_ROW_OPERATION_PTR: /* 24 */
+ stmt->errornumber = STMT_INVALID_OPTION_IDENTIFIER;
+ stmt->errormsg = "Unsupported statement option (Set)";
+ SC_log_error(func, "", stmt);
+ return SQL_ERROR;
+
+ case SQL_ATTR_FETCH_BOOKMARK_PTR: /* 16 */
+ stmt->options.bookmark_ptr = Value;
+
+ break;
+ case SQL_ATTR_ROW_STATUS_PTR: /* 25 */
+ stmt->options.rowStatusArray = (SQLUSMALLINT *) Value;
+
+ break;
+ case SQL_ATTR_ROWS_FETCHED_PTR: /* 26 */
+ stmt->options.rowsFetched = (SQLUINTEGER *) Value;
+
+ break;
+ case SQL_ATTR_ROW_ARRAY_SIZE: /* 27 */
+ stmt->options.rowset_size = (SQLUINTEGER) Value;
+
+ break;
+ default:
+ return PGAPI_SetStmtOption(StatementHandle, (UWORD) Attribute, (UDWORD) Value);
+ }
+ return SQL_SUCCESS;
+}
+
+#define SQL_FUNC_ESET(pfExists, uwAPI) \
+ (*(((UWORD*) (pfExists)) + ((uwAPI) >> 4)) \
+ |= (1 << ((uwAPI) & 0x000F)) \
+ )
+RETCODE SQL_API
+PGAPI_GetFunctions30(HDBC hdbc, UWORD fFunction, UWORD FAR * pfExists)
+{
+ if (fFunction != SQL_API_ODBC3_ALL_FUNCTIONS)
+ return SQL_ERROR;
+ memset(pfExists, 0, sizeof(UWORD) * SQL_API_ODBC3_ALL_FUNCTIONS_SIZE);
+
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLALLOCCONNECT); 1 deprecated */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLALLOCENV); 2 deprecated */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLALLOCSTMT); 3 deprecated */
+
+ /*
+ * for (i = SQL_API_SQLBINDCOL; i <= 23; i++) SQL_FUNC_ESET(pfExists,
+ * i);
+ */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLBINDCOL); /* 4 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCANCEL); /* 5 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCOLATTRIBUTE); /* 6 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCONNECT); /* 7 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLDESCRIBECOL); /* 8 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLDISCONNECT); /* 9 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLERROR); 10 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLEXECDIRECT); /* 11 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLEXECUTE); /* 12 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLFETCH); /* 13 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLFREECONNECT); 14 deprecated */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLFREEENV); 15 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLFREESTMT); /* 16 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETCURSORNAME); /* 17 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLNUMRESULTCOLS); /* 18 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPREPARE); /* 19 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLROWCOUNT); /* 20 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETCURSORNAME); /* 21 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLSETPARAM); 22 deprecated */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLTRANSACT); 23 deprecated */
+
+ /*
+ * for (i = 40; i < SQL_API_SQLEXTENDEDFETCH; i++)
+ * SQL_FUNC_ESET(pfExists, i);
+ */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCOLUMNS); /* 40 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLDRIVERCONNECT); /* 41 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLGETCONNECTOPTION); 42 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETDATA); /* 43 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETFUNCTIONS); /* 44 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETINFO); /* 45 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLGETSTMTOPTION); 46 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETTYPEINFO); /* 47 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPARAMDATA); /* 48 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPUTDATA); /* 49 */
+
+ /*
+ * SQL_FUNC_ESET(pfExists, SQL_API_SQLSETCONNECTIONOPTION); 50
+ * deprecated
+ */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLSETSTMTOPTION); 51 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSPECIALCOLUMNS); /* 52 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSTATISTICS); /* 53 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLTABLES); /* 54 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLBROWSECONNECT); /* 55 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCOLUMNPRIVILEGES); /* 56 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLDATASOURCES); /* 57 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLDESCRIBEPARAM); /* 58 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLEXTENDEDFETCH); 59 deprecated */
+
+ /*
+ * for (++i; i < SQL_API_SQLBINDPARAMETER; i++)
+ * SQL_FUNC_ESET(pfExists, i);
+ */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLFOREIGNKEYS); /* 60 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLMORERESULTS); /* 61 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLNATIVESQL); /* 62 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLNUMPARAMS); /* 63 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLPARAMOPTIONS); 64 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPRIMARYKEYS); /* 65 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPROCEDURECOLUMNS); /* 66 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLPROCEDURES); /* 67 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETPOS); /* 68 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETSCROLLOPTIONS); /* 69 deprecated */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLTABLEPRIVILEGES); /* 70 */
+ /* SQL_FUNC_ESET(pfExists, SQL_API_SQLDRIVERS); */ /* 71 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLBINDPARAMETER); /* 72 */
+
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLALLOCHANDLE); /* 1001 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLBINDPARAM); /* 1002 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCLOSECURSOR); /* 1003 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLCOPYDESC); /* 1004 not implemented
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLENDTRAN); /* 1005 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLFREEHANDLE); /* 1006 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETCONNECTATTR); /* 1007 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETDESCFIELD); /* 1008 not implemented
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETDESCREC); /* 1009 not implemented
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETDIAGFIELD); /* 1010 not implemented
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETDIAGREC); /* 1011 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETENVATTR); /* 1012 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLGETSTMTATTR); /* 1014 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETCONNECTATTR); /* 1016 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETDESCFIELD); /* 1017 not implemeted
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETDESCREC); /* 1018 not implemented
+ * yet */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETENVATTR); /* 1019 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLSETSTMTATTR); /* 1020 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLFETCHSCROLL); /* 1021 */
+ SQL_FUNC_ESET(pfExists, SQL_API_SQLBULKOPERATIONS); /* 24 not implemented
+ * yet */
+
+ return SQL_SUCCESS;
+}
+RETCODE SQL_API
+PGAPI_GetInfo30(HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue,
+ SWORD cbInfoValueMax, SWORD FAR * pcbInfoValue)
+{
+ static char *func = "PGAPI_GetInfo30";
+ ConnectionClass *conn = (ConnectionClass *) hdbc;
+ char *p = NULL;
+ int len = 0,
+ value = 0;
+ RETCODE result;
+
+ switch (fInfoType)
+ {
+ case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
+ len = 4;
+ value = 0;
+ break;
+ case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
+ len = 4;
+ value = 0;
+ break;
+
+ case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
+ len = 4;
+ value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE |
+ SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK;
+ break;
+ case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
+ len = 4;
+ value = 0;
+ break;
+ case SQL_KEYSET_CURSOR_ATTRIBUTES1:
+ len = 4;
+ value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE
+ | SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK
+ | SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION
+ | SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE
+ | SQL_CA1_POS_REFRESH
+ | SQL_CA1_BULK_ADD
+ | SQL_CA1_BULK_UPDATE_BY_BOOKMARK
+ | SQL_CA1_BULK_DELETE_BY_BOOKMARK
+ | SQL_CA1_BULK_FETCH_BY_BOOKMARK
+ ;
+ break;
+ case SQL_KEYSET_CURSOR_ATTRIBUTES2:
+ len = 4;
+ value = SQL_CA2_OPT_ROWVER_CONCURRENCY |
+ SQL_CA2_SENSITIVITY_ADDITIONS |
+ SQL_CA2_SENSITIVITY_DELETIONS |
+ SQL_CA2_SENSITIVITY_UPDATES;
+ break;
+
+ case SQL_STATIC_CURSOR_ATTRIBUTES1:
+ len = 4;
+ value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE |
+ SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK |
+ SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION |
+ SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE |
+ SQL_CA1_POS_REFRESH;
+ break;
+ case SQL_STATIC_CURSOR_ATTRIBUTES2:
+ len = 4;
+ value = SQL_CA2_OPT_ROWVER_CONCURRENCY |
+ SQL_CA2_SENSITIVITY_ADDITIONS |
+ SQL_CA2_SENSITIVITY_DELETIONS |
+ SQL_CA2_SENSITIVITY_UPDATES;
+ break;
+ default:
+ /* unrecognized key */
+ conn->errormsg = "Unrecognized key passed to SQLGetInfo.";
+ conn->errornumber = CONN_NOT_IMPLEMENTED_ERROR;
+ CC_log_error(func, "", conn);
+ return SQL_ERROR;
+ }
+ result = SQL_SUCCESS;
+ if (p)
+ {
+ /* char/binary data */
+ len = strlen(p);
+
+ if (rgbInfoValue)
+ {
+ strncpy_null((char *) rgbInfoValue, p, (size_t) cbInfoValueMax);
+
+ if (len >= cbInfoValueMax)
+ {
+ result = SQL_SUCCESS_WITH_INFO;
+ conn->errornumber = STMT_TRUNCATED;
+ conn->errormsg = "The buffer was too small for tthe InfoValue.";
+ }
+ }
+ }
+ else
+ {
+ /* numeric data */
+ if (rgbInfoValue)
+ {
+ if (len == 2)
+ *((WORD *) rgbInfoValue) = (WORD) value;
+ else if (len == 4)
+ *((DWORD *) rgbInfoValue) = (DWORD) value;
+ }
+ }
+
+ if (pcbInfoValue)
+ *pcbInfoValue = len;
+ return result;
+}