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

  1. /*
  2.  *  Program type:  API Interface
  3.  *
  4.  *  Description:
  5.  *        This program adds several departments with small default
  6.  *        budgets, using 'execute immediate' statement.
  7.  *        Then, a prepared statement, which doubles budgets for
  8.  *        departments with low budgets, is executed.
  9.  */
  10.  
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <stdio.h>
  14. #include "example.h"
  15. #include <ibase.h>
  16.  
  17. #define MAXLEN      256
  18. #define DNAMELEN    25
  19. #define DNOLEN      3
  20.  
  21.  
  22. int getline PROTO((char ISC_FAR *, int));
  23. int cleanup PROTO((void));
  24.  
  25.  
  26.  
  27. isc_db_handle    DB = NULL;             /* database handle */
  28. isc_tr_handle    trans = NULL;          /* transaction handle */
  29. long             status[20];            /* status vector */
  30. char             Db_name[128];
  31.  
  32. int main (ARG(int, argc), ARG(char **, argv))
  33. ARGLIST(int argc)
  34. ARGLIST(char **argv)
  35. {
  36.     int                 n = 0;
  37.     char                exec_str[MAXLEN];
  38.     char                prep_str[MAXLEN];
  39.     isc_stmt_handle     double_budget = NULL;    /* statement handle */
  40.  
  41.     if (argc > 1)
  42.         strcpy(Db_name, argv[1]);
  43.     else
  44.         strcpy(Db_name, "employee.gdb");
  45.  
  46.     if (isc_attach_database(status, 0, Db_name, &DB, 0, NULL))
  47.     {
  48.         ERREXIT(status, 1)
  49.     }
  50.  
  51.     cleanup();
  52.  
  53.     /*
  54.      *  Prepare a statement, which may be executed more than once.
  55.      */
  56.  
  57.     strcpy(prep_str,
  58.            "UPDATE DEPARTMENT SET budget = budget * 2 WHERE budget < 100000");
  59.  
  60.     /* Allocate a statement. */
  61.     if (isc_dsql_allocate_statement(status, &DB, &double_budget))
  62.     {
  63.         ERREXIT(status, 1)
  64.     }
  65.  
  66.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  67.     {
  68.         ERREXIT(status, 1)
  69.     }
  70.  
  71.     /* Prepare the statement. */
  72.     if (isc_dsql_prepare(status, &trans, &double_budget, 0, prep_str, 1, NULL))
  73.     {
  74.         ERREXIT(status, 1)
  75.     }
  76.  
  77.     /*
  78.      *  Add new departments, using 'execute immediate'.
  79.      *  Build each 'insert' statement, using the supplied parameters.
  80.      *  Since these statements will not be needed after they are executed,
  81.      *  use 'execute immediate'.
  82.      */
  83.     
  84.     while (getline(exec_str, n++))
  85.     {
  86.         printf("\nExecuting statement:\n%d:\t%s;\n", n, exec_str);
  87.  
  88.         if (isc_dsql_execute_immediate(status, &DB, &trans, 0, exec_str, 1, NULL))
  89.         {
  90.             ERREXIT(status, 1)
  91.         }
  92.     }   
  93.  
  94.     /*
  95.      *    Execute a previously prepared statement.
  96.      */
  97.     printf("\nExecuting a prepared statement:\n\t%s;\n\n", prep_str);
  98.  
  99.     if (isc_dsql_execute(status, &trans, &double_budget, 1, NULL))
  100.     {
  101.         ERREXIT(status, 1)
  102.     }
  103.  
  104.     if (isc_dsql_free_statement(status, &double_budget, DSQL_drop))
  105.     {
  106.         ERREXIT(status, 1)
  107.     }
  108.  
  109.     if (isc_commit_transaction(status, &trans))
  110.     {
  111.         ERREXIT(status, 1)
  112.     }
  113.  
  114.     if (isc_detach_database(status, &DB))
  115.     {
  116.         ERREXIT(status, 1)
  117.     }
  118.  
  119.     return 0;
  120. }
  121.  
  122. /*
  123.  *  Construct an 'insert' statement from the supplied parameters.
  124.  */
  125.  
  126. int getline (ARG(char ISC_FAR*, line), ARG(int, line_no))
  127. ARGLIST(char ISC_FAR* line)
  128. ARGLIST(int           line_no)
  129. {
  130.     static char ISC_FAR * Dept_data[] =
  131.         {
  132.             "117", "Field Office: Hong Kong",   "110",
  133.             "118", "Field Office: Australia",   "110",
  134.             "119", "Field Office: New Zealand", "110",
  135.             0
  136.         };
  137.  
  138.     char    dept_no[4];
  139.     char    department[30];
  140.     char    dept_head[4];
  141.  
  142.     if (Dept_data[3 * line_no] == 0)
  143.         return 0;
  144.  
  145.     strcpy(dept_no, Dept_data[3 * line_no]);
  146.     strcpy(department, Dept_data[3 * line_no + 1]);
  147.     strcpy(dept_head, Dept_data[3 * line_no + 2]);
  148.  
  149.     sprintf(line, "INSERT INTO DEPARTMENT (dept_no, department, head_dept) \
  150.             VALUES ('%s', '%s', '%s')", dept_no, department, dept_head);
  151.  
  152.     return 1;
  153. }
  154.  
  155. /*
  156.  *  Delete old data.
  157.  */
  158. int cleanup PROTO((void))
  159. {
  160.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  161.     {
  162.         ERREXIT(status, 1)
  163.     }
  164.  
  165.     if (isc_dsql_execute_immediate(status, &DB, &trans, 0,
  166.         "DELETE FROM department WHERE dept_no IN ('117', '118', '119')", 1, 0L))
  167.     {
  168.         ERREXIT(status, 1)
  169.     }
  170.  
  171.     if (isc_commit_transaction(status, &trans))
  172.     {
  173.         ERREXIT(status, 1)
  174.     }
  175.  
  176.     return 0;
  177. }
  178.