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

  1. /*
  2.  *  Program type:  API Interface
  3.  *
  4.  *    Description:
  5.  *      This program selects a blob data type.
  6.  *      A set of project descriptions is printed.
  7.  */
  8.  
  9.  
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ibase.h>
  13. #include <stdio.h>
  14. #include "example.h"
  15.  
  16. #define TYPELEN        12
  17. #define PROJLEN        20
  18. #define BUFLEN        512
  19.  
  20. /* This macro is used to declare structures representing SQL VARCHAR types */
  21. #define SQL_VARCHAR(len) struct {short vary_length; char vary_string[(len)+1];}
  22.  
  23. int main (ARG(int, argc), ARG(char **, argv))
  24. ARGLIST(int argc)
  25. ARGLIST(char **argv)                         
  26. {
  27.     SQL_VARCHAR(PROJLEN + 2)    proj_name;
  28.     char                        prod_type[TYPELEN + 2];
  29.     char                        sel_str[BUFLEN + 1];
  30.     ISC_QUAD                    blob_id;
  31.     isc_blob_handle             blob_handle = NULL;
  32.     short                       blob_seg_len;
  33.     char                        blob_segment[11];
  34.     isc_db_handle               DB = NULL;        /* database handle */
  35.     isc_tr_handle               trans = NULL;     /* transaction handle */
  36.     long                        status[20];       /* status vector */
  37.     isc_stmt_handle             stmt = NULL;      /* statement handle */
  38.     XSQLDA ISC_FAR *            sqlda;
  39.     long                        fetch_stat, blob_stat;
  40.     short                       flag0 = 0,
  41.                                 flag1 = 0,
  42.                                 flag2 = 0;
  43.     char                        empdb[128];
  44.  
  45.     if (argc > 1)
  46.         strcpy(empdb, argv[1]);
  47.     else
  48.         strcpy(empdb, "employee.gdb");
  49.  
  50.  
  51.     strcpy(sel_str, "SELECT proj_name, proj_desc, product FROM project WHERE \
  52.            product IN ('software', 'hardware', 'other') ORDER BY proj_name");
  53.  
  54.     if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
  55.     {
  56.         ERREXIT(status, 1)
  57.     }
  58.  
  59.     if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
  60.     {
  61.         ERREXIT(status, 1)
  62.     }
  63.  
  64.     /*
  65.      *    Allocate and prepare the select statement.
  66.      */
  67.  
  68.     if (isc_dsql_allocate_statement(status, &DB, &stmt))
  69.     {
  70.         ERREXIT(status, 1)
  71.     }
  72.     
  73.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(3));
  74.     sqlda->sqln = 3;
  75.     sqlda->version = 1;
  76.  
  77.     if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_str, 1, sqlda))
  78.     {
  79.         ERREXIT(status, 1)
  80.     }
  81.  
  82.     sqlda->sqlvar[0].sqldata = (char *)&proj_name;
  83.     sqlda->sqlvar[0].sqltype = SQL_VARYING + 1;
  84.     sqlda->sqlvar[0].sqlind  = &flag0;
  85.  
  86.     sqlda->sqlvar[1].sqldata = (char ISC_FAR *) &blob_id;
  87.     sqlda->sqlvar[1].sqltype = SQL_BLOB + 1;
  88.     sqlda->sqlvar[1].sqlind  = &flag1;
  89.  
  90.     sqlda->sqlvar[2].sqldata = prod_type;
  91.     sqlda->sqlvar[2].sqltype = SQL_TEXT + 1;
  92.     sqlda->sqlvar[2].sqlind  = &flag2;
  93.  
  94.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  95.     {
  96.         ERREXIT(status, 1)
  97.     }
  98.  
  99.     /*
  100.      *    For each project in the select statement, get and display
  101.      *    project descriptions.
  102.      */
  103.  
  104.     while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
  105.     {
  106.         prod_type[TYPELEN] = '\0';
  107.         printf("\nPROJECT:  %-20.*s   TYPE:  %-15s\n\n",
  108.                proj_name.vary_length, proj_name.vary_string, prod_type);
  109.  
  110.         /* Open the blob with the fetched blob_id.   Notice that the
  111.         *  segment length is shorter than the average segment fetched.
  112.         *  Each partial fetch should return isc_segment.
  113.         */
  114.         if (isc_open_blob(status, &DB, &trans, &blob_handle, &blob_id))
  115.         {
  116.             ERREXIT(status, 1)
  117.         }
  118.  
  119.         /* Get blob segments and their lengths and print each segment. */
  120.         blob_stat = isc_get_segment(status, &blob_handle,
  121.                                     (unsigned short ISC_FAR *) &blob_seg_len,
  122.                                     sizeof(blob_segment), blob_segment);
  123.         while (blob_stat == 0 || status[1] == isc_segment)
  124.         {
  125.             printf("%*.*s", blob_seg_len, blob_seg_len, blob_segment);
  126.             blob_stat = isc_get_segment(status, &blob_handle,
  127.                                         (unsigned short ISC_FAR *)&blob_seg_len,
  128.                                         sizeof(blob_segment), blob_segment);
  129.         }
  130.         /* Close the blob.  Should be blob_stat to check */
  131.         if (status[1] == isc_segstr_eof)
  132.         {
  133.             if (isc_close_blob(status, &blob_handle))
  134.             {
  135.                 ERREXIT(status, 1)
  136.             }
  137.         }
  138.         else
  139.             isc_print_status(status);
  140.  
  141.         printf("\n");
  142.     }
  143.  
  144.     if (fetch_stat != 100L)
  145.     {
  146.         ERREXIT(status, 1)
  147.     }
  148.  
  149.     if (isc_dsql_free_statement(status, &stmt, DSQL_close))
  150.     {
  151.         ERREXIT(status, 1)
  152.     }
  153.  
  154.     if (isc_commit_transaction (status, &trans))
  155.     {
  156.         ERREXIT(status, 1)
  157.     }
  158.  
  159.     if (isc_detach_database(status, &DB))
  160.     {
  161.         ERREXIT(status, 1)
  162.     }
  163.  
  164.     free(sqlda);
  165.  
  166.     return 0;
  167. }
  168.