Adding Parameters to a DPB

From InterBase

Go Up to Connecting to Databases


Sometimes it is useful to add parameters to an existing DPB at run time. For example, when an application runs, it might determine a user’s name and password and supply those values dynamically. The isc_expand_dpb() function can be used to pass the following additional parameters to a populated DPB at run time:

DPB Parameters Recognized by isc_expand_dpb( )
Parameter Purpose

isc_dpb_user_name

String user name, up to 255 characters

isc_dpb_password

String password, up to 255 characters

isc_dpb_lc_messages

String specifying a language-specific message file

isc_dpb_lc_ctype

String specifying the character set to be used

isc_dpb_sql_role_name

String role name, up to 255 characters

Important:
If you expect to add any of these parameters at run time, then create a larger than necessary DPB before calling isc_expand_dpb(), so that this function does not need to reallocate DPB storage space at run time. ­isc_expand_dbp() can reallocate space, but that space is not automatically freed when the database is detached.

isc_expand_dpb() requires the following parameters:

isc_expand_dbp() Parameters
Parameter Type Description

dpb

char **

Pointer to a DPB

dpb_size

unsigned short *

Pointer to the end of the currently used portion of the DPB

char *

Pointers to item type and items to add to the DPB

The third parameter in the table, “…”, indicates a variable number of replaceable parameters. Each parameter is a character pointer with a unique name. The final parameter must be a NULL or a hexadecimal zero.

Important:
isc_expand_dpb() allocates a new block for the DPB. To avoid memory leaks, call isc_free() to release that space.

The following code demonstrates how isc_expand_dpb() is called to add a user name and password to the DPB after they are elicited from a user at run time:

char dpb_buffer[256], *dpb, *p;
char uname[256], upass[256];
short dpb_length;

/* Construct a database parameter buffer. */
dpb = dpb_buffer;
*dpb++ = isc_dpb_version1;
*dpb++ = isc_dpb_num_buffers;
*dpb++ = 1;
*dpb++ = 90;
dpb_length = dpb - dpb_buffer;
dpb = dpb_buffer;

/* Now ask user for name and password. */
prompt_user("Enter your user name: ");
gets(uname);
prompt_user("\nEnter your password: ");
gets(upass);

/* Will string overflow buffer? */
if ((sizeof (dpb_buffer) - dpb_length) <= strlen (uname) + strlen (upass) +
sizeof (isc_dpb_user_name) + sizeof (isc_dpb_password)) {
/* Call expand_dpb) */
isc_expand_dpb(&dpb, &dpb_length, isc_dpb_user_name, uname,
isc_dpb_password, upass, NULL);
}
else
/* No, add parameters locally */
.....

See Also

Advance To: