home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 May / PCWorld_1999-05_cd.bin / software / Vyzkuste / inprise / INTRBASE_55 / EXAMPLES / API / API5.C < prev    next >
C/C++ Source or Header  |  1998-10-18  |  3KB  |  127 lines

  1. /*
  2.  *    Program type:  API Interface
  3.  *
  4.  *    Desription:
  5.  *        This program demonstrates the reallocation of SQLDA
  6.  *        and the 'isc_dsql_describe' statement.  After a query
  7.  *        is examined with 'isc_dsql_describe', an SQLDA of correct
  8.  *        size is reallocated, and some information is printed about
  9.  *        the query:  its type (select, non-select), the number
  10.  *        of columns, etc.
  11.  */
  12.  
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ibase.h>
  16. #include <stdio.h>
  17. #include "example.h"
  18.  
  19. char *sel_str =
  20.      "SELECT department, mngr_no, location, head_dept \
  21.       FROM department WHERE head_dept in ('100', '900', '600')";
  22.  
  23. isc_db_handle    DB = 0;                       /* database handle */
  24. isc_tr_handle    trans = 0;                    /* transaction handle */
  25. long             status[20];                   /* status vector */
  26.  
  27.  
  28. int main (ARG(int, argc), ARG(char **, argv))
  29. ARGLIST(int argc)
  30. ARGLIST(char **argv)
  31. {
  32.     int                num_cols, i;
  33.     isc_stmt_handle    stmt = NULL;
  34.     XSQLDA    ISC_FAR  *sqlda;
  35.     char               empdb[128];
  36.  
  37.     if (argc > 1)
  38.          strcpy(empdb, argv[1]);
  39.     else
  40.          strcpy(empdb, "employee.gdb");
  41.  
  42.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  43.     {
  44.         ERREXIT(status, 1)
  45.     }
  46.  
  47.     /* Allocate SQLDA of an arbitrary size. */
  48.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(3));
  49.     sqlda->sqln = 3;
  50.     sqlda->version = 1;
  51.  
  52.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  53.     {
  54.         ERREXIT(status, 1)
  55.     }
  56.  
  57.     /* Allocate a statement. */
  58.     if (isc_dsql_allocate_statement(status, &DB, &stmt))
  59.     {
  60.         ERREXIT(status, 1)
  61.     }
  62.  
  63.     /* Prepare the statement. */
  64.     if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_str, 1, sqlda))
  65.     {
  66.         ERREXIT(status, 1)
  67.     }
  68.  
  69.     /* Describe the statement. */
  70.     if (isc_dsql_describe(status, &stmt, 1, sqlda))
  71.     {
  72.         ERREXIT(status, 1)
  73.     }
  74.     
  75.     /* This is a select statement, print more information about it. */
  76.  
  77.     printf("Query Type:  SELECT\n\n");
  78.  
  79.     num_cols = sqlda->sqld;
  80.  
  81.     printf("Number of columns selected:  %d\n", num_cols);
  82.  
  83.     /* Reallocate SQLDA if necessary. */
  84.     if (sqlda->sqln < sqlda->sqld)
  85.     {
  86.         sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(num_cols));
  87.         sqlda->sqln = num_cols;
  88.         sqlda->version = 1;
  89.     
  90.         /* Re-describe the statement. */
  91.         if (isc_dsql_describe(status, &stmt, 1, sqlda))
  92.         {
  93.             ERREXIT(status, 1)
  94.         }
  95.  
  96.         num_cols = sqlda->sqld;
  97.     }
  98.  
  99.     /* List column names, types, and lengths. */
  100.     for (i = 0; i < num_cols; i++)
  101.     {
  102.         printf("\nColumn name:    %s\n", sqlda->sqlvar[i].sqlname);
  103.         printf("Column type:    %d\n", sqlda->sqlvar[i].sqltype);
  104.         printf("Column length:  %d\n", sqlda->sqlvar[i].sqllen);
  105.     }
  106.  
  107.  
  108.     if (isc_dsql_free_statement(status, &stmt, DSQL_drop))
  109.     {
  110.         ERREXIT(status, 1)
  111.     }
  112.  
  113.     if (isc_commit_transaction(status, &trans))
  114.     {
  115.         ERREXIT(status, 1)
  116.     }
  117.  
  118.     if (isc_detach_database(status, &DB))
  119.     {
  120.         ERREXIT (status, 1)
  121.     }
  122.  
  123.     free(sqlda);
  124.  
  125.     return 0;
  126. }
  127.