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

  1. /*
  2.  *    Program type:  API
  3.  *
  4.  *    Description:
  5.  *        This program selects and updates an array type.
  6.  *        Projected head count is displayed and updated for
  7.  *        a set of projects.
  8.  */
  9.  
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ibase.h>
  13. #include <stdio.h>
  14. #include "example.h"
  15.  
  16. char    *sel_str =
  17.     "SELECT dept_no, quart_head_cnt FROM proj_dept_budget p \
  18.     WHERE year = 1994 AND proj_id = 'VBASE' \
  19.     FOR UPDATE of quart_head_cnt";
  20.  
  21. char    *upd_str =
  22.     "UPDATE proj_dept_budget SET quart_head_cnt = ? WHERE CURRENT OF S";
  23.  
  24.  
  25. int main (ARG(int, argc), ARG(char **, argv))
  26. ARGLIST(int argc)
  27. ARGLIST(char **argv)
  28. {
  29.     long            hcnt[4];
  30.     ISC_QUAD        array_id;
  31.     ISC_ARRAY_DESC  desc;
  32.     long            len;
  33.     char            dept_no[6];
  34.     isc_db_handle   DB = NULL;
  35.     isc_tr_handle   trans = NULL;
  36.     long            status[20];
  37.     short           flag0 = 0, flag1 = 0;
  38.     isc_stmt_handle stmt = NULL;
  39.     isc_stmt_handle ustmt = NULL;
  40.     char ISC_FAR *  cursor = "S";
  41.     XSQLDA ISC_FAR *osqlda, *isqlda;
  42.     long            fetch_stat;
  43.     short           i;
  44.     char            empdb[128];
  45.  
  46.     if (argc > 1)
  47.         strcpy(empdb, argv[1]);
  48.     else
  49.         strcpy(empdb, "employee.gdb");
  50.  
  51.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  52.     {
  53.         ERREXIT(status, 1)
  54.     }
  55.  
  56.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  57.     {
  58.         ERREXIT(status, 1)
  59.     }          
  60.  
  61.     /*
  62.      *    Set up the array description structure
  63.      */
  64.  
  65.  
  66.     if (isc_array_lookup_bounds(status, &DB, &trans,
  67.                                 "PROJ_DEPT_BUDGET", "QUART_HEAD_CNT", &desc))
  68.     {
  69.         ERREXIT(status, 1)
  70.     }
  71.     
  72.     /*
  73.      *    Set-up the select statement.
  74.      */
  75.  
  76.     osqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(2));
  77.     osqlda->sqln = 2;
  78.     osqlda->version = 1;
  79.  
  80.     osqlda->sqlvar[0].sqldata = (char ISC_FAR *) dept_no;
  81.     osqlda->sqlvar[0].sqltype = SQL_TEXT + 1;
  82.     osqlda->sqlvar[0].sqlind  = &flag0;
  83.  
  84.     osqlda->sqlvar[1].sqldata = (char ISC_FAR *) &array_id;
  85.     osqlda->sqlvar[1].sqltype = SQL_ARRAY + 1;
  86.     osqlda->sqlvar[1].sqlind  = &flag1;
  87.  
  88.     isc_dsql_allocate_statement(status, &DB, &stmt);
  89.     isc_dsql_allocate_statement(status, &DB, &ustmt);
  90.  
  91.     /* Prepare and execute query */
  92.     if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_str, 1, osqlda))
  93.     {
  94.         ERREXIT(status, 1)
  95.     }
  96.  
  97.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  98.     {
  99.         ERREXIT(status, 1)
  100.     }
  101.  
  102.     /* Needed for update current */
  103.     isc_dsql_set_cursor_name(status, &stmt, cursor, 0);
  104.  
  105.     /*
  106.      *    Set-up the update statement.
  107.      */
  108.  
  109.     isqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));
  110.     isqlda->sqln = 1;
  111.     isqlda->version = 1;
  112.  
  113.     /* Use describe_bind to set up input sqlda */
  114.  
  115.     if (isc_dsql_prepare(status, &trans, &ustmt, 0, upd_str, 1, NULL))
  116.     {
  117.         ERREXIT(status, 1)
  118.     }
  119.     isc_dsql_describe_bind(status, &ustmt, 1, isqlda);
  120.  
  121.     isqlda->sqlvar[0].sqldata = (char ISC_FAR *) &array_id;
  122.     isqlda->sqlvar[0].sqlind  = &flag1;
  123.                               
  124.     /*
  125.      *    Fetch the head count for each department's 4 quarters;
  126.      *    increase the head count by 1 for each quarter;
  127.      *    and save the new head count.
  128.      */
  129.  
  130.     while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, osqlda)) == 0)
  131.     {
  132.         /* Get the current array values. */
  133.         if (!flag1)
  134.         {                     
  135.             len = sizeof(hcnt);;
  136.             if (isc_array_get_slice(status, &DB, &trans,
  137.                                     (ISC_QUAD ISC_FAR *) &array_id,
  138.                                     (ISC_ARRAY_DESC ISC_FAR *) &desc,
  139.                                     (void ISC_FAR *) hcnt,
  140.                                     (long ISC_FAR *) &len))
  141.                                     {ERREXIT (status, 1)};
  142.  
  143.             dept_no [osqlda->sqlvar[0].sqllen] = '\0';
  144.             printf("Department #:  %s\n\n", dept_no);
  145.  
  146.             printf("\tCurrent counts: %ld %ld %ld %ld\n",
  147.                    hcnt[0], hcnt[1], hcnt[2], hcnt[3]);
  148.  
  149.             /* Add 1 to each count. */
  150.             for (i = 0; i < 4; i++)
  151.                 hcnt[i] = hcnt[i] + 1;
  152.  
  153.             /* Save new array values. */
  154.             if (isc_array_put_slice(status, &DB, &trans,
  155.                                     (ISC_QUAD ISC_FAR *) &array_id,
  156.                                     (ISC_ARRAY_DESC ISC_FAR *) &desc,
  157.                                     (void ISC_FAR *) hcnt,
  158.                                     (long ISC_FAR *) &len))
  159.                                     {ERREXIT (status, 1)};
  160.  
  161.             /* Update the array handle. */
  162.             if (isc_dsql_execute(status, &trans, &ustmt, 1, isqlda))
  163.             {
  164.                 ERREXIT(status, 1)
  165.             }
  166.              
  167.             printf("\tNew counts    : %ld %ld %ld %ld\n\n",
  168.                    hcnt[0], hcnt[1], hcnt[2], hcnt[3]);
  169.         }
  170.     }
  171.        
  172.     if (fetch_stat != 100L)
  173.     {
  174.         ERREXIT(status, 1)
  175.     }
  176.  
  177.     isc_dsql_free_statement(status, &stmt, DSQL_close);
  178.     isc_dsql_free_statement(status, &ustmt, DSQL_close);
  179.  
  180.     /* Do a rollback to keep from updating the sample db */
  181.  
  182.     if (isc_rollback_transaction(status, &trans))
  183.     {
  184.         ERREXIT(status, 1)
  185.     }
  186.  
  187.     if (isc_detach_database(status, &DB))
  188.     {
  189.         ERREXIT(status, 1)
  190.     }
  191.  
  192.     free(osqlda);
  193.     free(isqlda);
  194.  
  195.     return 0;
  196. }
  197.