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

  1. /*
  2.  *    Program type:  API Interface
  3.  *
  4.  *    Description:
  5.  *        This program executes a stored procedure and selects from
  6.  *        a stored procedure.  First, a list of projects an employee
  7.  *        is involved in is printed.  Then the employee is added to
  8.  *        another project.  The new list of projects is printed again.
  9.  */
  10.  
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ibase.h>
  14. #include <stdio.h>
  15. #include "example.h"
  16.  
  17. #define    PROJLEN        5
  18. #define    BUFLEN        128
  19.  
  20. int select_projects PROTO((isc_db_handle db, int emp_no));
  21. int add_emp_proj PROTO((isc_db_handle db, int emp_no, char ISC_FAR * proj_id));
  22. int get_params PROTO((isc_db_handle db, int ISC_FAR * emp_no, char ISC_FAR * proj_id));
  23.  
  24. int main (ARG(int, argc), ARG(char **, argv))
  25. ARGLIST(int argc)
  26. ARGLIST(char **argv)
  27. {
  28.     int             emp_no;
  29.     char            proj_id[PROJLEN + 2];
  30.     isc_db_handle    db = NULL;
  31.     long            status[20];
  32.     char            empdb[128];
  33.  
  34.     if (argc > 1)
  35.         strcpy(empdb, argv[1]);
  36.     else
  37.         strcpy(empdb, "employee.gdb");
  38.  
  39.     if (isc_attach_database(status, 0, empdb, &db, 0, NULL))
  40.     {
  41.         ERREXIT(status, 1)
  42.     }
  43.  
  44.     /*
  45.      *  Add employee with id 8 to project 'MAPDB'.
  46.      */
  47.     if (get_params(db, &emp_no, proj_id))
  48.         return 1;
  49.  
  50.     /*
  51.      *  Display employee's current projects.
  52.      */
  53.     printf("\nCurrent projects for employee id: %d\n\n", emp_no);
  54.     if (select_projects(db, emp_no))
  55.         return 1;
  56.  
  57.     /*
  58.      *  Insert a new employee project row.
  59.      */
  60.     printf("\nAdd employee id: %d to project: %s\n", emp_no, proj_id);
  61.     if (add_emp_proj(db, emp_no, proj_id))
  62.         return 1;
  63.  
  64.     /*
  65.      *  Display employee's new current projects.
  66.      */
  67.     printf("\nCurrent projects for employee id: %d\n\n", emp_no);
  68.     if (select_projects(db, emp_no))
  69.         return 1;
  70.  
  71.  
  72.     if (isc_detach_database(status, &db))
  73.     {
  74.         ERREXIT(status, 1)
  75.     }
  76.  
  77.     return  0 ;
  78. }
  79.  
  80. /*
  81.  *    Select from a stored procedure.
  82.  *    Procedure 'get_emp_proj' gets employee's projects.
  83.  */
  84. int select_projects (ARG(isc_db_handle, db), ARG(int, emp_no))
  85. ARGLIST(void    *db)
  86. ARGLIST(int     emp_no)
  87. {
  88.     char            proj_id[PROJLEN + 2];
  89.     char            selstr[BUFLEN];
  90.     short           flag0 = 0;
  91.     isc_tr_handle   trans = NULL;
  92.     long            status[20];
  93.     isc_stmt_handle stmt = NULL;
  94.     XSQLDA  ISC_FAR *sqlda;
  95.     long            fetch_stat;
  96.  
  97.     sprintf(selstr, "SELECT proj_id FROM get_emp_proj (%d) ORDER BY proj_id",
  98.             emp_no);
  99.  
  100.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));
  101.     sqlda->sqln = 1;
  102.     sqlda->version = 1;
  103.  
  104.     if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
  105.     {
  106.         ERREXIT(status, 1)
  107.     }
  108.  
  109.     if (isc_dsql_allocate_statement(status, &db, &stmt))
  110.     {
  111.         ERREXIT(status, 1)
  112.     }
  113.  
  114.     if (isc_dsql_prepare(status, &trans, &stmt, 0, selstr, 1, sqlda))
  115.     {
  116.         ERREXIT(status, 1)
  117.     }
  118.  
  119.     sqlda->sqlvar[0].sqldata = (char ISC_FAR *) proj_id;
  120.     sqlda->sqlvar[0].sqlind  = &flag0;
  121.     sqlda->sqlvar[0].sqltype = SQL_TEXT + 1;
  122.  
  123.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  124.     {
  125.         ERREXIT(status, 1)
  126.     }
  127.  
  128.     while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
  129.     {
  130.         proj_id[PROJLEN] = '\0';
  131.         printf("\t%s\n", proj_id);
  132.     }
  133.  
  134.     if (fetch_stat != 100L)
  135.     {
  136.         ERREXIT(status, 1)
  137.     }
  138.  
  139.     if (isc_dsql_free_statement(status, &stmt, DSQL_close))
  140.     {
  141.         ERREXIT(status, 1)
  142.     }
  143.                               
  144.     if (isc_commit_transaction(status, &trans))
  145.     {
  146.         ERREXIT(status, 1)
  147.     }
  148.  
  149.     free(sqlda);
  150.  
  151.     return 0;
  152. }
  153.  
  154. /*
  155.  *    Execute a stored procedure.
  156.  *    Procedure 'add_emp_proj' adds an employee to a project.
  157.  */
  158. int add_emp_proj (ARG(isc_db_handle, db), ARG(int, emp_no), ARG(char ISC_FAR *, proj_id))
  159. ARGLIST(void    *db)
  160. ARGLIST(int     emp_no)
  161. ARGLIST(char    *proj_id)
  162. {
  163.     char            exec_str[BUFLEN];
  164.     isc_tr_handle   trans = NULL;
  165.     long            status[20];
  166.  
  167.     sprintf(exec_str, "EXECUTE PROCEDURE add_emp_proj %d, \"%s\"",
  168.             emp_no, proj_id);
  169.  
  170.     if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
  171.     {
  172.         ERREXIT(status, 1)
  173.     }
  174.  
  175.     if (isc_dsql_execute_immediate(status, &db, &trans, 0, exec_str, 1, NULL))
  176.     {
  177.         ERREXIT(status, 1)
  178.     }
  179.  
  180.     if (isc_commit_transaction(status, &trans))
  181.     {
  182.         ERREXIT (status, 1)
  183.     }
  184.  
  185.     return 0;
  186. }   
  187.  
  188. /*
  189.  *    Set-up procedure parameters and clean-up old data.
  190.  */
  191. int get_params (ARG(void ISC_FAR *, db),
  192.                 ARG(int ISC_FAR *, emp_no),
  193.                 ARG(char ISC_FAR *, proj_id))
  194. ARGLIST(void    *db)
  195. ARGLIST(int     *emp_no)
  196. ARGLIST(char    *proj_id)
  197. {
  198.     isc_tr_handle   trans = NULL;
  199.     long            status[20];
  200.  
  201.     *emp_no = 8;
  202.     strcpy(proj_id, "MAPDB");
  203.                      
  204.     /* Cleanup:  delete row from the previous run. */
  205.  
  206.     if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
  207.     {
  208.         ERREXIT(status, 1)
  209.     }
  210.  
  211.     if (isc_dsql_execute_immediate(status, &db, &trans, 0,
  212.                                    "DELETE FROM employee_project \
  213.                                    WHERE emp_no = 8 AND proj_id = 'MAPDB'", 1,
  214.                                    NULL))
  215.     {
  216.         ERREXIT(status, 1)
  217.     }
  218.  
  219.     if (isc_commit_transaction(status, &trans))
  220.     {
  221.         ERREXIT(status, 1)
  222.     }
  223.  
  224.     return 0;
  225. }
  226.