/*
**    Name: message.c
**
**    Date: Fri Aug  1 21:24:11 2003
**
*/

#include "odbcdm.h"
#include "ODBCLib.h"
#include "kernel.h"
#include "sqlext.h"
#include "sql.h"
#include "status.h"

extern toolbox_o status_window;

/* Handler for pending messages */

osbool message_pending(wimp_message *message,
                     void *handle)
    {
    wimp_event_no event_no;          /* Wimp event number       */

    wimp_block poll_block;           /* Wimp poll block         */

    _kernel_swi_regs regs;

    int type,
        subtype;

    osbool redraw = 0;

    SQLRETURN reply;

    ODBCLibParameter *p;

    message = message;
    handle = handle;

/* Check for pending query */

    regs.r[0] = SQL_QueryStatusGet;

    _kernel_swi(SQL_QueryStatus,&regs,&regs);

    if (regs.r[1] == ODBC_STATE_PENDING)
        {
/* Decode function and make call */

        regs.r[0] = SQL_QueryStatusType;

        _kernel_swi(SQL_QueryStatus,&regs,&regs);

        type = regs.r[1];
        subtype = regs.r[2];

        regs.r[0] = SQL_QueryStatusParameters;

        _kernel_swi(SQL_QueryStatus,&regs,&regs);

        p = (ODBCLibParameter *)regs.r[1];

        switch (type)
            {
            case SQL_Connection:

                switch (subtype)
                    {
                    case SQL_AllocConnect:
                        reply = SQLAllocConnect((SQLHENV)p[0].value,
                                                (SQLHDBC *)p[1].value);
                        riscosalloc++;
                        break;

                     case SQL_AllocEnv:
                         reply = SQLAllocEnv((SQLHENV *)p[0].value);
                         riscosalloc++;
                         break;

                     case SQL_AllocHandle:
                         reply = SQLAllocHandle((SQLSMALLINT)p[0].value,
                                                (SQLHANDLE)p[1].value,
                                                (SQLHANDLE *)p[2].value);
                         riscosalloc++;
                         break;

                     case SQL_AllocStmt:
                         reply = SQLAllocStmt((SQLHDBC)p[0].value,
                                              (SQLHSTMT *)p[1].value);
                         riscosalloc++;
                         break;

                     case SQL_Connect:
                         reply = SQLConnect((SQLHDBC)p[0].value,
                                            (SQLCHAR *)p[1].value,
                                            (SQLSMALLINT)p[2].value,
                                            (SQLCHAR *)p[3].value,
                                            (SQLSMALLINT)p[4].value,
                                            (SQLCHAR *)p[5].value,
                                            (SQLSMALLINT)p[6].value);
                         redraw = 1;
                         break;

                     case SQL_DriverConnect:

                         reply = SQLDriverConnect((SQLHDBC)p[0].value,
                                     (SQLHWND)p[1].value,
                                     (SQLCHAR *)p[2].value,
                                     (SQLSMALLINT)p[3].value,
                                     (SQLCHAR *)p[4].value,
                                     (SQLSMALLINT)p[5].value,
                                     (SQLSMALLINT *)p[6].value,
                                     (SQLUSMALLINT)p[7].value);
                         redraw = 1;
                         break;

                     case SQL_BrowseConnect:
                         reply = SQLBrowseConnect((SQLHDBC)p[0].value,
                                                  (SQLCHAR *)p[1].value,
                                                  (SQLSMALLINT)p[2].value,
                                                  (SQLCHAR *)p[3].value,
                                                  (SQLSMALLINT)p[4].value,
                                                  (SQLSMALLINT *)p[5].value);
                         break;

                     case SQL_FreeConnect:
                         reply = SQLFreeConnect((SQLHDBC)p[0].value);
                         redraw = 1;
                         riscosalloc--;
                         break;

                     case SQL_FreeEnv:
                         reply = SQLFreeEnv((SQLHENV)p[0].value);
                         redraw = 1;
                         riscosalloc--;
                         break;

                     case SQL_FreeHandle:
                         reply = SQLFreeHandle((SQLSMALLINT)p[0].value,
                                               (SQLHANDLE)p[1].value);
                         if (p[0].value == SQL_HANDLE_ENV)
                             {
                             redraw = 1;
                             }
                         riscosalloc--;

                         break;

                     case SQL_FreeStmt:
                         reply = SQLFreeStmt((SQLHSTMT)p[0].value,
                                             (SQLUSMALLINT)p[1].value);
                         riscosalloc--;
                         break;

                     case SQL_Disconnect:
                         reply = SQLDisconnect((SQLHDBC)p[0].value);
                         break;
                     }

                 break;

            case SQL_DriverInfo:

                 switch (subtype)
                     {
                     case SQL_DataSources:

                         reply = SQLDataSources((SQLHENV)p[0].value,
                                                (SQLUSMALLINT)p[1].value,
                                                (SQLCHAR *)p[2].value,
                                                (SQLSMALLINT)p[3].value,
                                                (SQLSMALLINT *)p[4].value,
                                                (SQLCHAR *)p[5].value,
                                                (SQLSMALLINT)p[6].value,
                                                (SQLSMALLINT *)p[7].value);
                         break;

                     case SQL_Drivers:

                         reply = SQLDrivers((SQLHENV)p[0].value,
                                            (SQLUSMALLINT)p[1].value,
                                            (SQLCHAR *)p[2].value,
                                            (SQLSMALLINT)p[3].value,
                                            (SQLSMALLINT *)p[4].value,
                                            (SQLCHAR *)p[5].value,
                                            (SQLSMALLINT)p[6].value,
                                            (SQLSMALLINT *)p[7].value);
                         break;

                     case SQL_GetFunctions:
                         reply = SQLGetFunctions((SQLHDBC)p[0].value,
                                                 (SQLUSMALLINT)p[1].value,
                                                 (SQLUSMALLINT *)p[2].value);
                         break;

                     case SQL_GetInfo:
                         reply = SQLGetInfo((SQLHDBC)p[0].value,
                                            (SQLUSMALLINT)p[1].value,
                                            (SQLPOINTER)p[2].value,
                                            (SQLSMALLINT)p[3].value,
                                            (SQLSMALLINT *)p[4].value);
                         break;

                     case SQL_GetTypeInfo:
                         reply = SQLGetTypeInfo((SQLHSTMT)p[0].value,
                                                (SQLSMALLINT)p[1].value);
                         break;
                     }
                 break;

             case SQL_DriverAttributes:

                 switch (subtype)
                     {
                     case SQL_GetConnectAttr:
                         reply = SQLGetConnectAttr((SQLHDBC)p[0].value,
                                                   (SQLINTEGER)p[1].value,
                                                   (SQLPOINTER)p[2].value,
                                                   (SQLINTEGER)p[3].value,
                                                   (SQLINTEGER *)p[4].value);
                         break;

                     case SQL_SetConnectAttr:
                         reply = SQLSetConnectAttr((SQLHDBC)p[0].value,
                                                   (SQLINTEGER)p[1].value,
                                                   (SQLPOINTER)p[2].value,
                                                   (SQLINTEGER)p[3].value);
                         break;

                     case SQL_GetEnvAttr:
                         reply = SQLGetEnvAttr((SQLHENV)p[0].value,
                                               (SQLINTEGER)p[1].value,
                                               (SQLPOINTER)p[2].value,
                                               (SQLINTEGER)p[3].value,
                                               (SQLINTEGER *)p[4].value);
                         break;

                     case SQL_SetEnvAttr:
                         reply = SQLSetEnvAttr((SQLHENV)p[0].value,
                                               (SQLINTEGER)p[1].value,
                                               (SQLPOINTER)p[2].value,
                                               (SQLINTEGER)p[3].value);
                         break;

                     case SQL_GetStmtAttr:
                         reply = SQLGetStmtAttr((SQLHSTMT)p[0].value,
                                                (SQLINTEGER)p[1].value,
                                                (SQLPOINTER)p[2].value,
                                                (SQLINTEGER)p[3].value,
                                                (SQLINTEGER *)p[4].value);
                         break;

                     case SQL_SetStmtAttr:
                         reply = SQLSetStmtAttr((SQLHSTMT)p[0].value,
                                                (SQLINTEGER)p[1].value,
                                                (SQLPOINTER)p[2].value,
                                                (SQLINTEGER)p[3].value);
                         break;
                     case SQL_GetConnectOption:
                         reply = SQLGetConnectOption((SQLHDBC)p[0].value,
                                                     (SQLUSMALLINT)p[1].value,
                                                     (SQLPOINTER)p[2].value);
                         break;

                     case SQL_SetConnectOption:
                         reply = SQLSetConnectOption((SQLHDBC)p[0].value,
                                                     (SQLUSMALLINT)p[1].value,
                                                     (SQLUINTEGER)p[2].value);
                         break;

                     case SQL_GetStmtOption:
                         reply = SQLGetStmtOption((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLPOINTER)p[2].value);
                         break;

                     case SQL_SetStmtOption:
                         reply = SQLSetStmtOption((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLUINTEGER)p[2].value);
                         break;
                     }
                 break;

             case SQL_Descriptor:

                 switch (subtype)
                     {
                     case SQL_GetDescField:
                         reply = SQLGetDescField((SQLHDESC)p[0].value,
                                                 (SQLSMALLINT)p[1].value,
                                                 (SQLSMALLINT)p[2].value,
                                                 (SQLPOINTER)p[3].value,
                                                 (SQLINTEGER)p[4].value,
                                                 (SQLINTEGER *)p[5].value);
                         break;

                     case SQL_SetDescField:
                         reply = SQLSetDescField((SQLHDESC)p[0].value,
                                                 (SQLSMALLINT)p[1].value,
                                                 (SQLSMALLINT)p[2].value,
                                                 (SQLPOINTER)p[3].value,
                                                 (SQLINTEGER)p[4].value);
                         break;

                     case SQL_GetDescRec:

                         reply = SQLGetDescRec((SQLHDESC)p[0].value,
                                               (SQLSMALLINT)p[1].value,
                                               (SQLCHAR *)p[2].value,
                                               (SQLSMALLINT)p[3].value,
                                               (SQLSMALLINT *)p[4].value,
                                               (SQLSMALLINT *)p[5].value,
                                               (SQLSMALLINT *)p[6].value,
                                               (SQLINTEGER *)p[7].value,
                                               (SQLSMALLINT *)p[8].value,
                                               (SQLSMALLINT *)p[9].value,
                                               (SQLSMALLINT *)p[10].value);
                         break;

                     case SQL_SetDescRec:

                         reply = SQLSetDescRec((SQLHDESC)p[0].value,
                                               (SQLSMALLINT)p[1].value,
                                               (SQLSMALLINT)p[2].value,
                                               (SQLSMALLINT)p[3].value,
                                               (SQLINTEGER)p[4].value,
                                               (SQLSMALLINT)p[5].value,
                                               (SQLSMALLINT)p[6].value,
                                               (SQLPOINTER)p[7].value,
                                               (SQLINTEGER *)p[8].value,
                                               (SQLINTEGER *)p[9].value);
                         break;
                     }
                 break;

             case SQL_Preparation:

                 switch (subtype)
                     {
                     case SQL_Prepare:
                         reply = SQLPrepare((SQLHSTMT)p[0].value,
                                            (SQLCHAR *)p[1].value,
                                            (SQLINTEGER)p[2].value);
                         break;

                     case SQL_BindParameter:

                         reply = SQLBindParameter((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLSMALLINT)p[2].value,
                                                  (SQLSMALLINT)p[3].value,
                                                  (SQLSMALLINT)p[4].value,
                                                  (SQLUINTEGER)p[5].value,
                                                  (SQLSMALLINT)p[6].value,
                                                  (SQLPOINTER)p[7].value,
                                                  (SQLINTEGER)p[8].value,
                                                  (SQLINTEGER *)p[9].value);
                         break;

                     case SQL_ParamOptions:
                         reply = SQLParamOptions((SQLHSTMT)p[0].value,
                                                 (SQLUINTEGER)p[1].value,
                                                 (SQLUINTEGER *)p[2].value);
                         break;

                     case SQL_GetCursorName:
                         reply = SQLGetCursorName((SQLHSTMT)p[0].value,
                                                  (SQLCHAR *)p[1].value,
                                                  (SQLSMALLINT)p[2].value,
                                                  (SQLSMALLINT *)p[3].value);
                         break;

                     case SQL_SetCursorName:
                         reply = SQLSetCursorName((SQLHSTMT)p[0].value,
                                                  (SQLCHAR *)p[1].value,
                                                  (SQLSMALLINT)p[2].value);
                         break;

                     case SQL_SetScrollOptions:
                         reply = SQLSetScrollOptions((SQLHSTMT)p[0].value,
                                                     (SQLUSMALLINT)p[1].value,
                                                     (SQLINTEGER)p[2].value,
                                                     (SQLUSMALLINT)p[3].value);
                         break;

                     case SQL_BindParam:

                         reply = SQLBindParam((SQLHSTMT)p[0].value,
                                              (SQLUSMALLINT)p[1].value,
                                              (SQLSMALLINT)p[2].value,
                                              (SQLSMALLINT)p[3].value,
                                              (SQLUINTEGER)p[4].value,
                                              (SQLSMALLINT)p[5].value,
                                              (SQLPOINTER)p[6].value,
                                              (SQLINTEGER *)p[7].value);
                         break;
                     }
                 break;

             case SQL_Request:

                 switch (subtype)
                     {
                     case SQL_Execute:
                         reply = SQLExecute((SQLHSTMT)p[0].value);
                         break;

                     case SQL_ExecDirect:
                         reply = SQLExecDirect((SQLHSTMT)p[0].value,
                                               (SQLCHAR *)p[1].value,
                                               (SQLINTEGER)p[2].value);
                         break;

                     case SQL_NativeSql:
                         reply = SQLNativeSql((SQLHDBC)p[0].value,
                                              (SQLCHAR *)p[1].value,
                                              (SQLINTEGER)p[2].value,
                                              (SQLCHAR *)p[3].value,
                                              (SQLINTEGER)p[4].value,
                                              (SQLINTEGER *)p[5].value);
                         break;

                     case SQL_DescribeParam:
                         reply = SQLDescribeParam((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLSMALLINT *)p[2].value,
                                                  (SQLUINTEGER *)p[3].value,
                                                  (SQLSMALLINT *)p[4].value,
                                                  (SQLSMALLINT *)p[5].value);
                         break;

                     case SQL_NumParams:
                         reply = SQLNumParams((SQLHSTMT)p[0].value,
                                              (SQLSMALLINT *)p[1].value);
                         break;

                     case SQL_ParamData:
                         reply = SQLParamData((SQLHSTMT)p[0].value,
                                              (SQLPOINTER *)p[1].value);
                         break;

                     case SQL_PutData:
                         reply = SQLPutData((SQLHSTMT)p[0].value,
                                            (SQLPOINTER)p[1].value,
                                            (SQLINTEGER)p[2].value);
                         break;
                     }

                 break;

             case SQL_Result:

                 switch (subtype)
                     {
                     case SQL_BindCol:
                         reply = SQLBindCol((SQLHSTMT)p[0].value,
                                            (SQLUSMALLINT)p[1].value,
                                            (SQLSMALLINT)p[2].value,
                                            (SQLPOINTER)p[3].value,
                                            (SQLINTEGER)p[4].value,
                                            (SQLINTEGER *)p[5].value);
                          break;

                     case SQL_BulkOperations:
                         reply = SQLBulkOperations((SQLHSTMT)p[0].value,
                                                   (SQLSMALLINT)p[1].value);
                         break;

                     case SQL_Fetch:
                         reply = SQLFetch((SQLHSTMT)p[0].value);
                         break;

                     case SQL_FetchScroll:
                         reply = SQLFetchScroll((SQLHSTMT)p[0].value,
                                                (SQLSMALLINT)p[1].value,
                                                (SQLINTEGER)p[2].value);
                         break;

                     case SQL_ExtendedFetch:
                         reply = SQLExtendedFetch((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLINTEGER)p[2].value,
                                                  (SQLUINTEGER *)p[3].value,
                                                  (SQLUSMALLINT *)p[4].value);
                         break;

                     case SQL_GetData:
                         reply = SQLGetData((SQLHSTMT)p[0].value,
                                            (SQLUSMALLINT)p[1].value,
                                            (SQLSMALLINT)p[2].value,
                                            (SQLPOINTER)p[3].value,
                                            (SQLINTEGER)p[4].value,
                                            (SQLINTEGER *)p[5].value);
                         break;

                     case SQL_SetPos:
                         reply = SQLSetPos((SQLHSTMT)p[0].value,
                                           (SQLUSMALLINT)p[1].value,
                                           (SQLUSMALLINT)p[2].value,
                                           (SQLUSMALLINT)p[3].value);
                         break;
                     }

                 break;

            case SQL_ResultInfo:

                switch (subtype)
                    {
                    case SQL_ColAttribute:
                        reply = SQLColAttribute((SQLHSTMT)p[0].value,
                                                (SQLUSMALLINT)p[1].value,
                                                (SQLUSMALLINT)p[2].value,
                                                (SQLPOINTER)p[3].value,
                                                (SQLSMALLINT)p[4].value,
                                                (SQLSMALLINT *)p[5].value,
                                                (SQLPOINTER)p[6].value);
                        break;

                    case SQL_ColAttributes:
                        reply = SQLColAttributes((SQLHSTMT)p[0].value,
                                                 (SQLUSMALLINT)p[1].value,
                                                 (SQLUSMALLINT)p[2].value,
                                                 (SQLPOINTER)p[3].value,
                                                 (SQLSMALLINT)p[4].value,
                                                 (SQLSMALLINT *)p[5].value,
                                                 (SQLINTEGER *)p[6].value);
                        break;

                    case SQL_DescribeCol:

                        reply = SQLDescribeCol((SQLHSTMT)p[0].value,
                                               (SQLUSMALLINT)p[1].value,
                                               (SQLCHAR *)p[2].value,
                                               (SQLSMALLINT)p[3].value,
                                               (SQLSMALLINT *)p[4].value,
                                               (SQLSMALLINT *)p[5].value,
                                               (SQLUINTEGER *)p[6].value,
                                               (SQLSMALLINT *)p[7].value,
                                               (SQLSMALLINT *)p[8].value);
                        break;

                    case SQL_NumResultCols:
                        reply = SQLNumResultCols((SQLHSTMT)p[0].value,
                                                 (SQLSMALLINT *)p[1].value);
                        break;

                    case SQL_RowCount:
                        reply = SQLRowCount((SQLHSTMT)p[0].value,
                                            (SQLINTEGER *)p[1].value);
                        break;

                    case SQL_MoreResults:
                        reply = SQLMoreResults((SQLHSTMT)p[0].value);
                        break;

                    case SQL_GetDiagField:
                        reply = SQLGetDiagField((SQLSMALLINT)p[0].value,
                                                (SQLHANDLE)p[1].value,
                                                (SQLSMALLINT)p[2].value,
                                                (SQLSMALLINT)p[3].value,
                                                (SQLPOINTER)p[4].value,
                                                (SQLSMALLINT)p[5].value,
                                                (SQLSMALLINT *)p[6].value);
                        break;

                    case SQL_GetDiagRec:

                        reply = SQLGetDiagRec((SQLSMALLINT)p[0].value,
                                              (SQLHANDLE)p[1].value,
                                              (SQLSMALLINT)p[2].value,
                                              (SQLCHAR *)p[3].value,
                                              (SQLINTEGER *)p[4].value,
                                              (SQLCHAR *)p[5].value,
                                              (SQLSMALLINT)p[6].value,
                                              (SQLSMALLINT *)p[7].value);
                        break;

                    case SQL_Error:

                         reply = SQLError((SQLHENV)p[0].value,
                                          (SQLHDBC)p[1].value,
                                          (SQLHSTMT)p[2].value,
                                          (SQLCHAR *)p[3].value,
                                          (SQLINTEGER *)p[4].value,
                                          (SQLCHAR *)p[5].value,
                                          (SQLSMALLINT)p[6].value,
                                          (SQLSMALLINT *)p[7].value);
                        break;

                    }

                break;

            case SQL_SystemTables:

                switch (subtype)
                    {
                    case SQL_ColumnPrivileges:

                        reply = SQLColumnPrivileges((SQLHSTMT)p[0].value,
                                                    (SQLCHAR *)p[1].value,
                                                    (SQLSMALLINT)p[2].value,
                                                    (SQLCHAR *)p[3].value,
                                                    (SQLSMALLINT)p[4].value,
                                                    (SQLCHAR *)p[5].value,
                                                    (SQLSMALLINT)p[6].value,
                                                    (SQLCHAR *)p[7].value,
                                                    (SQLSMALLINT)p[8].value);
                        break;

                    case SQL_Columns:

                        reply = SQLColumns((SQLHSTMT)p[0].value,
                                           (SQLCHAR *)p[1].value,
                                           (SQLSMALLINT)p[2].value,
                                           (SQLCHAR *)p[3].value,
                                           (SQLSMALLINT)p[4].value,
                                           (SQLCHAR *)p[5].value,
                                           (SQLSMALLINT)p[6].value,
                                           (SQLCHAR *)p[7].value,
                                           (SQLSMALLINT)p[8].value);
                        break;

                    case SQL_SpecialColumns:

                        reply = SQLSpecialColumns((SQLHSTMT)p[0].value,
                                                  (SQLUSMALLINT)p[1].value,
                                                  (SQLCHAR *)p[2].value,
                                                  (SQLUSMALLINT)p[3].value,
                                                  (SQLCHAR *)p[4].value,
                                                  (SQLUSMALLINT)p[5].value,
                                                  (SQLCHAR *)p[6].value,
                                                  (SQLSMALLINT)p[7].value,
                                                  (SQLUSMALLINT)p[8].value,
                                                  (SQLUSMALLINT)p[9].value);
                        break;

                    case SQL_ForeignKeys:

                        reply = SQLForeignKeys((SQLHSTMT)p[0].value,
                                           (SQLCHAR *)p[1].value,
                                           (SQLSMALLINT)p[2].value,
                                           (SQLCHAR *)p[3].value,
                                           (SQLSMALLINT)p[4].value,
                                           (SQLCHAR *)p[5].value,
                                           (SQLSMALLINT)p[6].value,
                                           (SQLCHAR *)p[7].value,
                                           (SQLSMALLINT)p[8].value,
                                           (SQLCHAR *)p[9].value,
                                           (SQLSMALLINT)p[10].value,
                                           (SQLCHAR *)p[11].value,
                                           (SQLSMALLINT)p[12].value);
                        break;

                    case SQL_PrimaryKeys:
                        reply = SQLPrimaryKeys((SQLHSTMT)p[0].value,
                                               (SQLCHAR *)p[1].value,
                                               (SQLSMALLINT)p[2].value,
                                               (SQLCHAR *)p[3].value,
                                               (SQLSMALLINT)p[4].value,
                                               (SQLCHAR *)p[5].value,
                                               (SQLSMALLINT)p[6].value);
                        break;

                    case SQL_ProcedureColumns:

                        reply = SQLProcedureColumns((SQLHSTMT)p[0].value,
                                                    (SQLCHAR *)p[1].value,
                                                    (SQLSMALLINT)p[2].value,
                                                    (SQLCHAR *)p[3].value,
                                                    (SQLSMALLINT)p[4].value,
                                                    (SQLCHAR *)p[5].value,
                                                    (SQLSMALLINT)p[6].value,
                                                    (SQLCHAR *)p[7].value,
                                                    (SQLSMALLINT)p[8].value);
                        break;

                    case SQL_Procedures:
                        reply = SQLProcedures((SQLHSTMT)p[0].value,
                                              (SQLCHAR *)p[1].value,
                                              (SQLSMALLINT)p[2].value,
                                              (SQLCHAR *)p[3].value,
                                              (SQLSMALLINT)p[4].value,
                                              (SQLCHAR *)p[5].value,
                                              (SQLSMALLINT)p[6].value);
                        break;

                    case SQL_Statistics:

                        reply = SQLStatistics((SQLHSTMT)p[0].value,
                                              (SQLCHAR *)p[1].value,
                                              (SQLSMALLINT)p[2].value,
                                              (SQLCHAR *)p[3].value,
                                              (SQLSMALLINT)p[4].value,
                                              (SQLCHAR *)p[5].value,
                                              (SQLSMALLINT)p[6].value,
                                              (SQLUSMALLINT)p[7].value,
                                              (SQLUSMALLINT)p[8].value);
                        break;

                    case SQL_TablePrivileges:
                        reply = SQLTablePrivileges((SQLHSTMT)p[0].value,
                                                   (SQLCHAR *)p[1].value,
                                                   (SQLSMALLINT)p[2].value,
                                                   (SQLCHAR *)p[3].value,
                                                   (SQLSMALLINT)p[4].value,
                                                   (SQLCHAR *)p[5].value,
                                                   (SQLSMALLINT)p[6].value);
                        break;

                    case SQL_Tables:

                        reply = SQLTables((SQLHSTMT)p[0].value,
                                          (SQLCHAR *)p[1].value,
                                          (SQLSMALLINT)p[2].value,
                                          (SQLCHAR *)p[3].value,
                                          (SQLSMALLINT)p[4].value,
                                          (SQLCHAR *)p[5].value,
                                          (SQLSMALLINT)p[6].value,
                                          (SQLCHAR *)p[7].value,
                                          (SQLSMALLINT)p[8].value);
                        break;
                    }

                break;

            case SQL_Terminate:

                switch (subtype)
                    {
                    case SQL_CloseCursor:
                        reply = SQLCloseCursor((SQLHSTMT)p[0].value);
                        break;

                    case SQL_Cancel:
                        reply = SQLCancel((SQLHSTMT)p[0].value);
                        break;

                    case SQL_EndTran:
                         reply = SQLEndTran((SQLSMALLINT)p[0].value,
                                            (SQLHANDLE)p[1].value,
                                            (SQLSMALLINT)p[2].value);
                        break;

                    case SQL_Transact:
                         reply = SQLTransact((SQLHENV)p[0].value,
                                             (SQLHDBC)p[1].value,
                                             (SQLUSMALLINT)p[2].value);
                        break;
                    }

                break;
            }

        regs.r[0] = SQL_QueryStatusReplySet;
        regs.r[1] = (int)reply;

        _kernel_swi(SQL_QueryStatus,&regs,&regs);

        regs.r[0] = SQL_QueryStatusSet;
        regs.r[1] = ODBC_STATE_COMPLETE;

        _kernel_swi(SQL_QueryStatus,&regs,&regs);

        if (choices.nicecount && type != SQL_Connection)
            {
            choices.nicecount--;

            if (choices.nicecount == 0)
                {
                event_poll(&event_no,
                           &poll_block,
                           0);

                if (choices.nice == 1)
                    {
                    choices.nicecount = 100;
                    }
                else
                    {
                    choices.nicecount = 10;
                    }
                }
            }

/* Send message */

        message->action = message_SQL_COMPLETE;
        message->your_ref = message->my_ref;

        xwimp_send_message(wimp_USER_MESSAGE,
                           message,
                           message->sender);

        if (redraw && status_window != NULL)
            {
            status_force_redraw();
            }
        }

    return TRUE;
    }
