home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 May / PCWorld_1999-05_cd.bin / software / Vyzkuste / inprise / INTRBASE_55 / EXAMPLES / API / STAT12.E < prev    next >
Text File  |  1998-10-18  |  3KB  |  128 lines

  1. /*
  2.  *  Program type:   Embedded Static SQL
  3.  *
  4.  *    Description:
  5.  *        This program utilizes the event mechanism for processing
  6.  *        newly entered sales orders.  It initializes an event called
  7.  *        "new_order", and then loops waiting for and processing new
  8.  *        orders as they come in.
  9.  *
  10.  *        When a new sales order is entered, a trigger defined in the
  11.  *        database posts the "new_order" event.  When the program is
  12.  *        notified of the event, it opens the cursor for selecting all
  13.  *        orders with status "new".  For each fetched order, a transaction
  14.  *        is started, which changes the order status from "new" to "open
  15.  *        and takes some action to initiate order processing.  After all
  16.  *        the new orders (if there were more than one) are processed, it
  17.  *        goes back to waiting for new orders.
  18.  *
  19.  *        To trigger the event, while running this program, run stat12t.
  20.  */
  21.  
  22. #include "example.h"
  23. #include <stdlib.h>
  24.  
  25. int process_order PROTO((char *));
  26.  
  27. EXEC SQL
  28.     BEGIN DECLARE SECTION;
  29.  
  30. EXEC SQL
  31.     SET DATABASE empdb = "employee.gdb";
  32.  
  33. long    *t1;
  34. long    *t2;
  35.  
  36. EXEC SQL
  37.     END DECLARE SECTION;
  38.  
  39.  
  40. int main(ARG(int, argc), ARG(char **, argv))
  41. ARGLIST(int argc)
  42. ARGLIST(char **argv)
  43. {
  44.     int    ret = 0;
  45.     BASED_ON sales.po_number pon;
  46.  
  47.     EXEC SQL
  48.         WHENEVER SQLERROR GO TO Error;
  49.  
  50.     EXEC SQL
  51.         CONNECT empdb;
  52.  
  53.     /* Go with read committed to see updates */
  54.     EXEC SQL
  55.         SET TRANSACTION READ COMMITTED;
  56.  
  57.     EXEC SQL
  58.         DECLARE get_order CURSOR FOR
  59.         SELECT po_number
  60.         FROM sales
  61.         WHERE order_status = "new"
  62.         FOR UPDATE OF order_status;
  63.  
  64.     EXEC SQL
  65.         EVENT INIT order_wait empdb ("new_order");
  66.  
  67.     while (!ret)
  68.     {
  69.         printf("\nStat 12 Waiting ...\n\n");
  70.         EXEC SQL
  71.             EVENT WAIT order_wait;
  72.  
  73.         EXEC SQL
  74.             OPEN get_order;
  75.         for (;;)    
  76.         {
  77.             EXEC SQL
  78.                 FETCH get_order INTO :pon;
  79.  
  80.             if (SQLCODE == 100)
  81.                 break;
  82.  
  83.             EXEC SQL
  84.                 UPDATE sales
  85.                 SET order_status = "open"
  86.                 WHERE CURRENT OF get_order;
  87.  
  88.             ret = process_order(pon);
  89.  
  90.         }
  91.         EXEC SQL
  92.             CLOSE get_order;
  93.  
  94.     }
  95.     EXEC SQL 
  96.         COMMIT;
  97.  
  98.     EXEC SQL
  99.         DISCONNECT empdb;
  100.  
  101.     exit(0);
  102. Error:
  103.     isc_print_sqlerror(SQLCODE, gds__status);
  104.     exit(1);
  105. }
  106.  
  107.  
  108. /*
  109.  *    Initiate order processing for a newly received sales order.
  110.  */
  111. int process_order(ARG(char *, pon))
  112. ARGLIST(char * pon)
  113. {
  114.     /*
  115.      *    This function would start a back-ground job, such as
  116.      *    sending the new orders to the printer, or generating
  117.      *    e-mail messages to the appropriate departments.
  118.      */
  119.  
  120.     printf("Stat12:  Received order:  %s\n", pon);
  121.     if (!strncmp(pon, "VNEW4", 5))
  122.     {
  123.         printf ("Stat12: exiting\n");
  124.         return 1;
  125.     }
  126.     return 0;
  127. }
  128.