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

  1. /*
  2.  *  Program type:  API Interface
  3.  *
  4.  *  Desription:
  5.  *      This program updates departments' budgets, given
  6.  *      the department and the new budget information parameters.
  7.  *
  8.  *      An input SQLDA is allocated for the update query
  9.  *      with parameter markers.
  10.  *      Note that all updates are rolled back in this version.
  11.  */
  12.  
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ibase.h>
  16. #include <stdio.h>
  17. #include "example.h"
  18.  
  19. int get_input PROTO((char* , double*));
  20.  
  21. static char *Dept_data[] =
  22.      {"622", "100", "116", "900", 0};
  23.  
  24. static double Percent_data[] =
  25.     {0.05,  1.00,  0.075,  0.10, 0};
  26.  
  27. int Input_ptr = 0;
  28.  
  29. char *updstr =
  30.     "UPDATE department SET budget = ? * budget + budget WHERE dept_no = ?";
  31.  
  32. isc_db_handle    DB = NULL;                       /* database handle */
  33. isc_tr_handle    trans = NULL;                    /* transaction handle */
  34. long             status[20];                      /* status vector */
  35.  
  36. int main (ARG(int, argc), ARG(char **, argv))
  37. ARGLIST(int argc)
  38. ARGLIST(char **argv)
  39. {
  40.     char            dept_no[4];
  41.     double          percent_inc;
  42.     short           flag0 = 0, flag1 = 0;
  43.     XSQLDA  ISC_FAR *sqlda;
  44.     long            sqlcode;
  45.     char            empdb[128];
  46.  
  47.     if (argc > 1)
  48.         strcpy(empdb, argv[1]);
  49.     else
  50.         strcpy(empdb, "employee.gdb");
  51.     
  52.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  53.     {
  54.         ERREXIT(status, 1)
  55.     }
  56.  
  57.     /* Allocate an input SQLDA.  There are two unknown parameters. */
  58.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(2));
  59.     sqlda->sqln = 2;
  60.     sqlda->sqld = 2;
  61.     sqlda->version = 1;
  62.  
  63.     sqlda->sqlvar[0].sqldata = (char ISC_FAR *) &percent_inc;
  64.     sqlda->sqlvar[0].sqltype = SQL_DOUBLE + 1;
  65.     sqlda->sqlvar[0].sqllen  = sizeof(percent_inc);
  66.     sqlda->sqlvar[0].sqlind  = &flag0;
  67.     flag0 = 0;
  68.  
  69.     sqlda->sqlvar[1].sqldata = dept_no;
  70.     sqlda->sqlvar[1].sqltype = SQL_TEXT + 1;
  71.     sqlda->sqlvar[1].sqllen  = 3;
  72.     sqlda->sqlvar[1].sqlind  = &flag1;
  73.     flag1 = 0;               
  74.  
  75.     /*
  76.      *  Get the next department-percent increase input pair.
  77.      */
  78.     while (get_input(dept_no, &percent_inc))
  79.     {
  80.         printf("\nIncreasing budget for department:  %s  by %5.2lf percent.\n",
  81.                dept_no, percent_inc);
  82.  
  83.         if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  84.         {
  85.             ERREXIT(status, 1)
  86.         }
  87.  
  88.         /* Update the budget. */
  89.         isc_dsql_execute_immediate(status, &DB, &trans, 0, updstr, 1, sqlda);
  90.         sqlcode = isc_sqlcode(status);
  91.         if (sqlcode)
  92.         {
  93.             /* Don't save the update, if the new budget exceeds the limit. */
  94.             if (sqlcode == -625)
  95.             {
  96.                 printf("\tExceeded budget limit -- not updated.\n");
  97.  
  98.                 if (isc_rollback_transaction(status, &trans))
  99.                 {
  100.                     ERREXIT(status, 1)
  101.                 }
  102.                 continue;
  103.             }
  104.             /* Undo all changes, in case of an error. */
  105.             else
  106.             {
  107.                 isc_print_status(status);
  108.                 printf("SQLCODE=%d\n", sqlcode);
  109.  
  110.                 isc_rollback_transaction(status, &trans);
  111.                 ERREXIT(status, 1)
  112.             }
  113.         }
  114.  
  115.         /* Save each department's update independently. 
  116.         ** Change to isc_commit_transaction to see changes
  117.          */
  118.         if (isc_rollback_transaction (status, &trans))
  119.         {
  120.             ERREXIT(status, 1)
  121.         }
  122.     }
  123.  
  124.     if (isc_detach_database(status, &DB))
  125.     {
  126.         ERREXIT(status, 1)
  127.     }
  128.  
  129.     free(sqlda);
  130.  
  131.     return 0;
  132. }
  133.  
  134.  
  135. /*
  136.  *  Get the department and percent parameters.
  137.  */
  138.  
  139. int get_input (ARG(char *,dept_no), ARG(double *,percent))
  140. ARGLIST(char *dept_no)
  141. ARGLIST(double *percent)
  142. {
  143.     if (Dept_data[Input_ptr] == 0)
  144.         return 0;
  145.  
  146.     strcpy(dept_no, Dept_data[Input_ptr]);
  147.  
  148.     if ((*percent = Percent_data[Input_ptr++]) == 0)
  149.         return 0;
  150.  
  151.     return 1;
  152. }
  153.