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

  1. /*
  2.  *    Program type:  API Interface
  3.  *
  4.  *    Description:
  5.  *        This program displays employee names and phone extensions.
  6.  *
  7.  *        It allocates an output SQLDA, prepares and executes a statement,
  8.  *        and loops fetching multiple rows.
  9.  *
  10.  *        The SQLCODE returned by fetch is checked.
  11.  */
  12.  
  13.  
  14.  
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include <ibase.h>
  19. #include "example.h"
  20.  
  21. #define    LASTLEN     20
  22. #define    FIRSTLEN    15
  23. #define    EXTLEN       4
  24.  
  25. /* This macro is used to declare structures representing SQL VARCHAR types */
  26. #define SQL_VARCHAR(len) struct {short vary_length; char vary_string[(len)+1];}
  27.  
  28. int main (ARG(int, argc), ARG(char **, argv))
  29. ARGLIST(int argc)
  30. ARGLIST(char **argv)
  31. {
  32.     SQL_VARCHAR(LASTLEN)    last_name;
  33.     SQL_VARCHAR(FIRSTLEN)   first_name;
  34.     char                    phone_ext[EXTLEN + 2];
  35.     short                   flag0 = 0, flag1 = 0;
  36.     short                   flag2 = 0;
  37.     isc_stmt_handle         stmt = NULL;                /* statement handle */
  38.     isc_db_handle           DB = NULL;                  /* database handle */
  39.     isc_tr_handle           trans = NULL;               /* transaction handle */
  40.     long                    status[20];                 /* status vector */
  41.     XSQLDA  ISC_FAR *       sqlda;
  42.     long                    fetch_stat;
  43.     char                    empdb[128];
  44.     char                    *sel_str =
  45.         "SELECT last_name, first_name, phone_ext FROM phone_list \
  46.         WHERE location = 'Monterey' ORDER BY last_name, first_name;";
  47.  
  48.     if (argc > 1)
  49.         strcpy(empdb, argv[1]);
  50.     else
  51.         strcpy(empdb, "employee.gdb");
  52.  
  53.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  54.         isc_print_status(status);
  55.  
  56.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  57.     {
  58.         ERREXIT(status, 1)
  59.     }
  60.     
  61.     /* Allocate an output SQLDA. */
  62.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(3));
  63.     sqlda->sqln = 3;
  64.     sqlda->sqld = 3;
  65.     sqlda->version = 1;
  66.  
  67.     /* Allocate a statement. */
  68.     if (isc_dsql_allocate_statement(status, &DB, &stmt))
  69.     {
  70.         ERREXIT(status, 1)
  71.     }
  72.     
  73.     /* Prepare the statement. */
  74.     if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_str, 1, sqlda))
  75.     {
  76.         ERREXIT(status, 1)
  77.     }
  78.     
  79.     /*
  80.      *  Although all three selected columns are of type varchar, the
  81.      *  third field's type is changed and printed as type TEXT.
  82.      */
  83.  
  84.     sqlda->sqlvar[0].sqldata = (char *)&last_name;
  85.     sqlda->sqlvar[0].sqltype = SQL_VARYING + 1;
  86.     sqlda->sqlvar[0].sqlind  = &flag0;
  87.  
  88.     sqlda->sqlvar[1].sqldata = (char *)&first_name;
  89.     sqlda->sqlvar[1].sqltype = SQL_VARYING + 1;
  90.     sqlda->sqlvar[1].sqlind  = &flag1;
  91.  
  92.     sqlda->sqlvar[2].sqldata = (char ISC_FAR *) phone_ext;
  93.     sqlda->sqlvar[2].sqltype = SQL_TEXT + 1;
  94.     sqlda->sqlvar[2].sqlind  = &flag2;
  95.  
  96.     printf("\n%-20s %-15s %-10s\n\n", "LAST NAME", "FIRST NAME", "EXTENSION");
  97.  
  98.     /* Execute the statement. */
  99.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  100.     {
  101.         ERREXIT(status, 1)
  102.     }
  103.             
  104.     /*
  105.      *    Fetch and print the records.
  106.      *    Status is 100 after the last row is fetched.
  107.      */
  108.     while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
  109.     {
  110.         printf("%-20.*s ", last_name.vary_length, last_name.vary_string);
  111.  
  112.         printf("%-15.*s ", first_name.vary_length, first_name.vary_string);
  113.  
  114.         phone_ext[sqlda->sqlvar[2].sqllen] = '\0';
  115.         printf("%s\n", phone_ext);
  116.     }
  117.  
  118.     if (fetch_stat != 100L)
  119.     {
  120.         ERREXIT(status, 1)
  121.     }
  122.  
  123.     /* Free statement handle. */
  124.     if (isc_dsql_free_statement(status, &stmt, DSQL_close))
  125.     {
  126.         ERREXIT(status, 1)
  127.     }
  128.  
  129.  
  130.     if (isc_commit_transaction(status, &trans))
  131.     {
  132.         ERREXIT(status, 1)
  133.     }
  134.  
  135.     if (isc_detach_database(status, &DB))
  136.     {
  137.         ERREXIT(status, 1)
  138.     }
  139.  
  140.     free( sqlda);
  141.  
  142.     return 0;
  143. }            
  144.