Example: The get_results() function

The user function, get_results(), demonstrates the mi_get_result() row-retrieval loop, controlled with the mi_get_result() function. It also demonstrates the use of the mi_result_command_name() function to get the name of the current statement and the mi_result_row_count() function to get the number of rows affected by this statement.

/*
 * FUNCTION: get_results()
 * PURPOSE: Get results of current statement. 
 *          Obtain the kind of statement and the number of
 *               rows affected.
 *          Return the number of rows affected.
 *
 * CALLED BY: send_statement()
 * See Example: The send_statement() function.
 */

 #include "mi.h"
   mi_integer get_results(MI_CONNECTION *conn)
 {
    mi_integer
   count;
    mi_integer
   result;
    char
         cmd[25];
     while
 (
 (result = mi_get_result(conn) )
           != MI_NO_MORE_RESULTS
 )
       {
       switch( result )
          {
          case MI_ERROR:
             mi_db_error_raise(conn, MI_EXCEPTION,
        "Could not get statement results (mi_get_result)\n");
           case MI_DDL:
             count = 0;
             break;
           case MI_DML:
             count = handle_dml(conn);
              break;
           case MI_ROWS:
             count = get_data(conn);
             break;
           default:
             mi_db_error_raise(conn, MI_EXCEPTION,
        "Unknown statement results (mi_get_result)\n");
           } /* end switch */
       } /* end while */
     return ( count );
 }
When a query returns rows of data, the mi_get_result() loop in get_results() executes three times:
  1. The first iteration of the mi_get_result() loop returns MI_ROWS to indicate that the query has successfully opened a cursor.

    The get_results() function executes the MI_ROWS case of the switch statement. This function then calls another user function, get_data(), to iterate over all query rows. For the implementation of the get_data() function, see Example: The get_data() function.

  2. The second iteration of the mi_get_result() loop returns MI_DML to indicate that the cursor processing has completed and the query has successfully completed.

    The get_data() function has handled the rows in the cursor so no more query rows remain to be processed. The get_results() function executes the MI_DML case of the switch statement, which calls the handle_dml() function to obtain the name and number of statements from the current statement. For the implementation of the handle_dml() function, see Sample function to handle MI_DML statement status.

  3. The third iteration of the mi_get_result() loop returns MI_NO_MORE_RESULTS to indicate that processing for the query is complete.

    The MI_NO_MORE_RESULTS value from mi_get_result() causes the mi_get_result() loop to terminate.