可能存在更好的方法,但以下方法有效。连接说明符——传递给olog() 的第三个字符串——通常是指在tnsnames.ora 中找到的条目。但是,它也可以是整个条目,而不是这样的快捷方式,这就是我在这种情况下想要的。
所以,我使用tnsnames.ora 中通常使用的完整语法来描述我的代码中的服务器。然后我将文本作为连接说明符传递给olog():
bzero(&lda, sizeof(lda));
bzero(&hda, sizeof(hda));
connlen = snprintf(buf, sizeof buf,
"(DESCRIPTION =\n"
" (ADDRESS_LIST =\n"
" (ADDRESS =\n"
" (PROTOCOL = TCP)\n"
" (HOST = %s)\n"
" (PORT = %s)\n"
" )\n"
" )\n"
" (CONNECT_DATA =\n"
" (SID = %s)\n"
" )\n"
")",
dbparam_keys[DbHostName].value,
dbparam_keys[DbServerPortNumber].value,
dbparam_keys[DbServerOrServiceName].value);
if (connlen >= sizeof buf)
errx(EX_SOFTWARE, "Internal error: buffer not big enough: "
"need %zd, have %zd bytes", connlen, sizeof buf);
if (verbose)
warnx("Connecting to %.*s", connlen, buf);
if (olog(&lda, (ub1 *)hda,
dbparam_keys[DbUser].value, -1,
dbparam_keys[DbPassword].value, -1,
buf, connlen,
OCI_LM_DEF)) {
errx(EX_NOPERM, "Logging into Oracle failed: %s",
oraerr(&lda, buf, sizeof(buf)));
}