Adding Parameters to a DPB
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:
Table 4.4 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:
Table 4.5 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 | |
... | chart* | 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 */
.....