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

  1. /*
  2.  *    Program type:  API Interface
  3.  *
  4.  *    Description:
  5.  *        This program uses a filter to display a blob data type.
  6.  *        Job descriptions are read through a filter, which formats
  7.  *        the text into 40-character-wide paragraphs.
  8.  *
  9.  *    IMPORTANT NOTE!
  10.  *        The server side file, api9f.c, must have been compiled
  11.  *        and linked and must be running on the server before
  12.  *        this example can be run.
  13.  */
  14.  
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include <ibase.h>
  19. #include "example.h"
  20.  
  21. #define COUNTRYLEN 15
  22. #define CODELEN    5
  23.  
  24. char    *sel_str =
  25.     "SELECT job_requirement, job_code, job_grade, job_country \
  26.      FROM job WHERE job_code = 'SRep'";
  27.  
  28. /* Blob parameter buffer. */
  29. char bpb[] = {1,2,2,-4,-1,1,2,1,0};
  30.  
  31. int main (ARG(int, argc), ARG(char **, argv))
  32. ARGLIST(int argc)
  33. ARGLIST(char **argv)
  34. {
  35.     char                job_code[CODELEN + 2];
  36.     short               job_grade;
  37.     char                job_country[COUNTRYLEN + 2];
  38.     short               flag0 = 0, flag1 = 0,
  39.                         flag2 = 0, flag3 = 0;
  40.     ISC_QUAD            blob_id;
  41.     isc_blob_handle     blob_handle = NULL;
  42.     short               blob_seg_len;
  43.     char                blob_segment[401];
  44.     isc_db_handle       DB = NULL;
  45.     isc_tr_handle       trans = NULL;
  46.     long                status[20];
  47.     isc_stmt_handle     stmt = NULL;
  48.     XSQLDA ISC_FAR *    sqlda;
  49.     long                fetch_stat;
  50.     char                empdb[128];
  51.  
  52.     if (argc > 1)
  53.         strcpy(empdb, argv[1]);
  54.     else
  55.         strcpy(empdb, "employee.gdb");
  56.  
  57.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  58.     {
  59.         ERREXIT(status, 1)
  60.     }
  61.  
  62.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  63.     {
  64.         ERREXIT(status, 1)
  65.     }
  66.  
  67.     /*
  68.      *    Allocate and prepare the select statement.
  69.      */
  70.  
  71.     if (isc_dsql_allocate_statement(status, &DB, &stmt))
  72.     {
  73.         ERREXIT(status, 1)
  74.     }
  75.  
  76.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(4));
  77.     sqlda->sqln = 4;
  78.     sqlda->version = 1;
  79.  
  80.     if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_str, 1, sqlda))
  81.     {
  82.         ERREXIT(status, 1)
  83.     }
  84.  
  85.     sqlda->sqlvar[0].sqldata = (char ISC_FAR *) &blob_id;
  86.     sqlda->sqlvar[0].sqltype = SQL_BLOB + 1;
  87.     sqlda->sqlvar[0].sqlind  = &flag0;
  88.  
  89.     sqlda->sqlvar[1].sqldata = (char ISC_FAR *) job_code;
  90.     sqlda->sqlvar[1].sqltype = SQL_TEXT + 1;
  91.     sqlda->sqlvar[1].sqlind  = &flag1;
  92.  
  93.     sqlda->sqlvar[2].sqldata = (char ISC_FAR *) &job_grade;
  94.     sqlda->sqlvar[2].sqltype = SQL_SHORT + 1;
  95.     sqlda->sqlvar[2].sqlind  = &flag2;
  96.  
  97.     sqlda->sqlvar[3].sqldata = (char ISC_FAR *) job_country;
  98.     sqlda->sqlvar[3].sqltype = SQL_TEXT + 1;
  99.     sqlda->sqlvar[3].sqlind  = &flag3;
  100.  
  101.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  102.     {
  103.         ERREXIT(status, 1)
  104.     }
  105.             
  106.     /*
  107.      *  Display job descriptions.
  108.      */
  109.  
  110.     while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
  111.     {
  112.         job_code[CODELEN] = '\0';
  113.         job_country[COUNTRYLEN] = '\0';
  114.         printf("\nJOB CODE: %5s  GRADE: %d", job_code, job_grade);
  115.         printf("  COUNTRY:  %-20s\n\n", job_country);
  116.  
  117.         /* Open the blob with the fetched blob_id. */
  118.         if (isc_open_blob2(status, &DB, &trans, &blob_handle, &blob_id, 9, bpb))
  119.         {
  120.             ERREXIT(status, 1)
  121.         }
  122.  
  123.         /* Get blob segments and their lengths and print each segment. */
  124.         while (isc_get_segment(status, &blob_handle,
  125.                (unsigned short ISC_FAR *) &blob_seg_len, sizeof(blob_segment),
  126.                blob_segment) == 0)
  127.             printf("  %*.*s", blob_seg_len, blob_seg_len, blob_segment);
  128.  
  129.         /* Close the blob.  */
  130.         if (status[1] == isc_segstr_eof)
  131.         {
  132.             if (isc_close_blob(status, &blob_handle))
  133.             {
  134.                 ERREXIT(status, 1)
  135.             }
  136.         }
  137.         else
  138.             isc_print_status(status);
  139.  
  140.         printf("\n");
  141.     }
  142.  
  143.     if (fetch_stat != 100L)
  144.         isc_print_status(status);
  145.  
  146.     if (isc_dsql_free_statement(status, &stmt, DSQL_drop))
  147.     {
  148.         ERREXIT(status, 1)
  149.     }
  150.  
  151.     if (isc_commit_transaction(status, &trans))
  152.     {
  153.         ERREXIT(status, 1)
  154.     }
  155.  
  156.     if (isc_detach_database(status, &DB))
  157.     {
  158.         ERREXIT(status, 1)
  159.     }
  160.  
  161.     free(sqlda);
  162.  
  163.     return 0;
  164. }
  165.