Connessione a Oracle con olog () su hostname specifico: port

Il programma C che sto scrivendo cerca di connettersi al database Oracle con olog() :

 olog(&lda, (ub1 *)hda, dbparam_keys[DbUser].value, -1, dbparam_keys[DbPassword].value, -1, NULL, -1, (ub4)OCI_LM_DEF); 

Questo fallisce con ORA-12545 , perché non specificano né il nome host del server, né il numero di porta da nessuna parte. Io no, perché non lo so, come farlo …

Le “demo” in bundle con il client sembrano presupporre un nome tnsnames.ora valido – il file è obbligatorio per l’API OCI o un programma client può, che conosce i valori necessari, specificarli nella libreria (ad esempio con OCIAttrSet() ) tutto da solo?

Lì, probabilmente, esiste un modo migliore, ma i seguenti lavori. Lo specificatore della connessione – la terza stringa passata a olog() – normalmente si riferisce a una voce trovata in tnsnames.ora . Ma, invece di essere una scorciatoia, può anche essere l’intera voce , che è ciò che voglio in questo caso.

Quindi, sto usando la syntax completa normalmente usata in tnsnames.ora per descrivere il server nel mio codice. Passo quindi il testo come olog() connessione a 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))); }