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

  1. /*
  2.  *    Program type:  API
  3.  *
  4.  *    Description:
  5.  *        This program demonstrates constructing a database
  6.  *        parameter buffer and attaching to a database.
  7.  *        First manually set sweep interval, then
  8.  *        The user and password is set to "guest" with expand_dpb
  9.  *        Then get back the sweep interval and other useful numbers
  10.  *        with an info call.
  11.  *        This program will accept up to 4 args.  All are positional:
  12.  *        api15 <db_name> <user> <password> <sweep_interval>
  13.  *
  14.  *        Note: The system administrator needs to create the account
  15.  *        "guest" with password "guest" on the server before this
  16.  *        example can be run.
  17.  */
  18.  
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include "example.h"
  24. #include <ibase.h>
  25.  
  26. int main (ARG(int, argc), ARG(char **, argv))
  27. ARGLIST(int argc)
  28. ARGLIST(char **argv)
  29. {
  30.     isc_db_handle   db = NULL;      /* database handle */
  31.     isc_tr_handle   trans = NULL;     /* transaction handle */
  32.     isc_stmt_handle stmt = NULL;
  33.     long            status[20];     /* status vector */
  34.     char            dbname[128];
  35.     char            user_name[31], uname[81];
  36.     short           nullind;
  37.     char            password[31];
  38.  
  39.     /* Query to find current user name */
  40.     static char ISC_FAR *query = "SELECT USER FROM RDB$DATABASE";
  41.     char ISC_FAR *  dpb = NULL,    /* DB parameter buffer */
  42.                     *d, *p, *copy;
  43.     XSQLDA ISC_FAR  *sqlda;
  44.  
  45.     short           dpb_length = 0;
  46.     long            l,sweep_interval = 16384;
  47.  
  48.     /* All needed for analyzing an info packet */
  49.     char            buffer[100];    /* Buffer for db info */
  50.     char            item;
  51.     short           length;
  52.     long            value_out;
  53.  
  54.     /* List of items for db_info call */
  55.     static char    db_items [] = {
  56.                         isc_info_page_size,
  57.                         isc_info_allocation,
  58.                         isc_info_sweep_interval,
  59.                         isc_info_end
  60.                     };
  61.  
  62.     strcpy(user_name, "guest");
  63.     strcpy(password, "guest");
  64.     strcpy(dbname, "employee.gdb");
  65.  
  66.     if (argc > 1)
  67.         strcpy(dbname, argv[1]);
  68.     if (argc > 2)
  69.         strcpy(user_name, argv[2]);
  70.     if (argc > 3)
  71.         strcpy(password, argv[3]);
  72.     if (argc > 4)
  73.         sweep_interval = atoi(argv[4]);
  74.  
  75.     /* Adding sweep interval will be done by hand 
  76.     **  First byte is a version (1), next byte is the isc_dpb_sweep
  77.     **  byte, then a length (4) then the byte-swapped int we want
  78.     **  to provide -- 7 bytes total
  79.     */
  80.  
  81.     copy = dpb = (char *) malloc(7);
  82.     p = dpb;
  83.     *p++ = '\1';
  84.     *p++ = isc_dpb_sweep_interval;
  85.     *p++ = '\4';
  86.     l = isc_vax_integer((char ISC_FAR *) &sweep_interval, 4);
  87.     d = (char *) &l;
  88.     *p++ = *d++;
  89.     *p++ = *d++;
  90.     *p++ = *d++;
  91.     *p = *d;
  92.     dpb_length = 7;
  93.  
  94.     /* Add user and password to dpb, much easier.  The dpb will be
  95.     **  new memory.
  96.     */
  97.     isc_expand_dpb(&dpb, (short ISC_FAR *) &dpb_length,
  98.                    isc_dpb_user_name, user_name,
  99.                    isc_dpb_password, password,  NULL);
  100.  
  101.     /*
  102.     **  Connect to the database with the given user and pw.
  103.     */            
  104.     printf("Attaching to %s with user name: %s, password: %s\n",
  105.            dbname, user_name, password);
  106.     printf("Resetting sweep interval to %ld\n", sweep_interval);
  107.  
  108.     if (isc_attach_database(status, 0, dbname, &db, dpb_length, dpb))
  109.         isc_print_status(status);
  110.  
  111.  
  112.     /* Prove we are "guest" . Query a single row with the
  113.     ** key word "USER" to find out who we are
  114.     */     
  115.     if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
  116.         isc_print_status(status);
  117.     
  118.     /* Prepare sqlda for singleton fetch */
  119.     sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));
  120.     sqlda->sqln = sqlda->sqld = 1;
  121.     sqlda->version = 1;
  122.     sqlda->sqlvar[0].sqldata = uname;
  123.     sqlda->sqlvar[0].sqlind = &nullind;
  124.  
  125.     /* Yes, it is possible to execute a singleton select without
  126.     ** a cursor.  You must prepare the sqlda by hand.
  127.     */
  128.     isc_dsql_allocate_statement(status, &db, &stmt);
  129.     if (isc_dsql_prepare(status, &trans, &stmt, 0, query, 1, sqlda))
  130.     {
  131.         ERREXIT(status, 1)
  132.     }
  133.     /* Force to type sql_text */
  134.     sqlda->sqlvar[0].sqltype = SQL_TEXT;
  135.  
  136.     if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
  137.     {
  138.         ERREXIT(status, 1)
  139.     }
  140.     /* There will only be one row.  If it isn't there, something is
  141.     **  seriously wrong.
  142.     */
  143.     if (isc_dsql_fetch(status, &stmt, 1, sqlda))
  144.     {
  145.         ERREXIT(status, 1)
  146.     }
  147.  
  148.     isc_dsql_free_statement(status, &stmt, DSQL_close);
  149.  
  150.     uname[sqlda->sqlvar[0].sqllen] = '\0';
  151.     printf ("New user = %s\n", uname);
  152.     if (isc_commit_transaction(status, &trans))
  153.     {
  154.         ERREXIT(status, 1)
  155.     }
  156.  
  157.     /* Look at the database to see some parameters (like sweep
  158.     ** The database_info call returns a buffer full of type, length,
  159.     **  and value sets until info_end is reached
  160.     */
  161.  
  162.     if (isc_database_info(status, &db, sizeof(db_items), db_items,
  163.                           sizeof (buffer), buffer))
  164.     {
  165.         ERREXIT(status, 1)
  166.     }
  167.  
  168.     for (d = buffer; *d != isc_info_end;)
  169.     {
  170.         value_out = 0;
  171.         item = *d++;
  172.         length = (short) isc_vax_integer (d, 2);
  173.         d += 2;
  174.         switch (item)
  175.         {    
  176.             case isc_info_end:
  177.                 break;
  178.  
  179.             case isc_info_page_size:
  180.                 value_out = isc_vax_integer (d, length);
  181.                 printf ("PAGE_SIZE %ld \n", value_out);
  182.                 break;
  183.  
  184.             case isc_info_allocation:
  185.                 value_out = isc_vax_integer (d, length);
  186.                 printf ("Number of DB pages allocated = %ld \n", 
  187.                 value_out);
  188.                 break;
  189.  
  190.             case isc_info_sweep_interval:
  191.                 value_out = isc_vax_integer (d, length);
  192.                 printf ("Sweep interval = %ld \n", value_out);
  193.                 break;
  194.         }
  195.         d += length;
  196.     }    
  197.  
  198.     isc_detach_database(status, &db);
  199.     isc_free(dpb);
  200.     free(copy);
  201.     free(sqlda);
  202.  
  203.     return 0;
  204. }
  205.