/* * Program type: API * * Description: * This program demonstrates constructing a database * parameter buffer and attaching to a database. * First manually set sweep interval, then * The user and password is set to "guest" with expand_dpb * Then get back the sweep interval and other useful numbers * with an info call. * This program will accept up to 4 args. All are positional: * api15 * * Note: The system administrator needs to create the account * "guest" with password "guest" on the server before this * example can be run. * The contents of this file are subject to the Interbase Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy * of the License at http://www.Inprise.com/IPL.html * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express * or implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code was created by Inprise Corporation * and its predecessors. Portions created by Inprise Corporation are * Copyright (C) Inprise Corporation. * * All Rights Reserved. * Contributor(s): ______________________________________. */ #include #include #include #include "example.h" #include int main (int argc, char** argv) { isc_db_handle db = NULL; /* database handle */ isc_tr_handle trans = NULL; /* transaction handle */ isc_stmt_handle stmt = NULL; ISC_STATUS_ARRAY status; /* status vector */ char dbname[128]; char user_name[31], uname[81]; short nullind; char password[31]; /* Query to find current user name */ static char *query = "SELECT USER FROM RDB$DATABASE"; char * dpb = NULL, /* DB parameter buffer */ *d, *p, *copy; XSQLDA *sqlda; short dpb_length = 0; long l,sweep_interval = 16384; /* All needed for analyzing an info packet */ char buffer[100]; /* Buffer for db info */ char item; short length; long value_out; /* List of items for db_info call */ static char db_items [] = { isc_info_page_size, isc_info_allocation, isc_info_sweep_interval, isc_info_end }; strcpy(user_name, "guest"); strcpy(password, "guest"); strcpy(dbname, "employee.fdb"); if (argc > 1) strcpy(dbname, argv[1]); if (argc > 2) strcpy(user_name, argv[2]); if (argc > 3) strcpy(password, argv[3]); if (argc > 4) sweep_interval = atoi(argv[4]); /* Adding sweep interval will be done by hand ** First byte is a version (1), next byte is the isc_dpb_sweep ** byte, then a length (4) then the byte-swapped int we want ** to provide -- 7 bytes total */ copy = dpb = (char *) malloc(7); p = dpb; *p++ = '\1'; *p++ = isc_dpb_sweep_interval; *p++ = '\4'; l = isc_vax_integer((char *) &sweep_interval, 4); d = (char *) &l; *p++ = *d++; *p++ = *d++; *p++ = *d++; *p = *d; dpb_length = 7; /* Add user and password to dpb, much easier. The dpb will be ** new memory. */ isc_expand_dpb(&dpb, (short *) &dpb_length, isc_dpb_user_name, user_name, isc_dpb_password, password, NULL); /* ** Connect to the database with the given user and pw. */ printf("Attaching to %s with user name: %s, password: %s\n", dbname, user_name, password); printf("Resetting sweep interval to %ld\n", sweep_interval); if (isc_attach_database(status, 0, dbname, &db, dpb_length, dpb)) isc_print_status(status); /* Prove we are "guest" . Query a single row with the ** key word "USER" to find out who we are */ if (isc_start_transaction(status, &trans, 1, &db, 0, NULL)) isc_print_status(status); /* Prepare sqlda for singleton fetch */ sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1)); sqlda->sqln = sqlda->sqld = 1; sqlda->version = 1; sqlda->sqlvar[0].sqldata = uname; sqlda->sqlvar[0].sqlind = &nullind; /* Yes, it is possible to execute a singleton select without ** a cursor. You must prepare the sqlda by hand. */ isc_dsql_allocate_statement(status, &db, &stmt); if (isc_dsql_prepare(status, &trans, &stmt, 0, query, 1, sqlda)) { ERREXIT(status, 1) } /* Force to type sql_text */ sqlda->sqlvar[0].sqltype = SQL_TEXT; if (isc_dsql_execute(status, &trans, &stmt, 1, NULL)) { ERREXIT(status, 1) } /* There will only be one row. If it isn't there, something is ** seriously wrong. */ if (isc_dsql_fetch(status, &stmt, 1, sqlda)) { ERREXIT(status, 1) } isc_dsql_free_statement(status, &stmt, DSQL_close); uname[sqlda->sqlvar[0].sqllen] = '\0'; printf ("New user = %s\n", uname); if (isc_commit_transaction(status, &trans)) { ERREXIT(status, 1) } /* Look at the database to see some parameters (like sweep ** The database_info call returns a buffer full of type, length, ** and value sets until info_end is reached */ if (isc_database_info(status, &db, sizeof(db_items), db_items, sizeof (buffer), buffer)) { ERREXIT(status, 1) } for (d = buffer; *d != isc_info_end;) { value_out = 0; item = *d++; length = (short) isc_vax_integer (d, 2); d += 2; switch (item) { case isc_info_end: break; case isc_info_page_size: value_out = isc_vax_integer (d, length); printf ("PAGE_SIZE %ld \n", value_out); break; case isc_info_allocation: value_out = isc_vax_integer (d, length); printf ("Number of DB pages allocated = %ld \n", value_out); break; case isc_info_sweep_interval: value_out = isc_vax_integer (d, length); printf ("Sweep interval = %ld \n", value_out); break; } d += length; } isc_detach_database(status, &db); isc_free(dpb); free(copy); free(sqlda); return 0; }