/* * call-seq: * PG.init_ssl(do_ssl) -> nil * * Allows applications to select which security libraries to initialize. * * This function is equivalent to <tt>PG.init_openssl(do_ssl, do_ssl)</tt> . It is sufficient for * applications that initialize both or neither of OpenSSL and libcrypto. */ static VALUE pg_s_init_ssl(VALUE self, VALUE do_ssl) { UNUSED( self ); PQinitSSL(pg_to_bool_int(do_ssl)); return Qnil; }
/************************************************************************* * * Function: sql_create_socket * * Purpose: Establish connection to the db * *************************************************************************/ static int sql_init_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) { char connstring[2048]; const char *port, *host; rlm_sql_postgres_sock *pg_sock; #ifdef HAVE_OPENSSL_CRYPTO_H static int ssl_init = 0; if (!ssl_init) { PQinitSSL(0); ssl_init = 1; } #endif if (config->sql_server[0] != '\0') { host = " host="; } else { host = ""; } if (config->sql_port[0] != '\0') { port = " port="; } else { port = ""; } if (!sqlsocket->conn) { sqlsocket->conn = (rlm_sql_postgres_sock *)rad_malloc(sizeof(rlm_sql_postgres_sock)); if (!sqlsocket->conn) { return -1; } } pg_sock = sqlsocket->conn; memset(pg_sock, 0, sizeof(*pg_sock)); snprintf(connstring, sizeof(connstring), "dbname=%s%s%s%s%s user=%s password=%s", config->sql_db, host, config->sql_server, port, config->sql_port, config->sql_login, config->sql_password); pg_sock->row=NULL; pg_sock->result=NULL; pg_sock->conn=PQconnectdb(connstring); if (PQstatus(pg_sock->conn) != CONNECTION_OK) { radlog(L_ERR, "rlm_sql_postgresql: Couldn't connect socket to PostgreSQL server %s@%s:%s", config->sql_login, config->sql_server, config->sql_db); /*radlog(L_ERR, "rlm_sql_postgresql: Postgresql error '%s'", PQerrorMessage(pg_sock->conn));*/ sql_close(sqlsocket, config); return SQL_DOWN; } return 0; }
/************************************************************************* * * Function: sql_create_socket * * Purpose: Establish connection to the db * *************************************************************************/ static int sql_init_socket(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { char dbstring[2048]; char const *port, *host; rlm_sql_postgres_conn_t *conn; #ifdef HAVE_OPENSSL_CRYPTO_H static int ssl_init = 0; if (!ssl_init) { PQinitSSL(0); ssl_init = 1; } #endif if (config->sql_server[0] != '\0') { host = " host="; } else { host = ""; } if (config->sql_port[0] != '\0') { port = " port="; } else { port = ""; } MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_postgres_conn_t)); talloc_set_destructor(conn, _sql_socket_destructor); snprintf(dbstring, sizeof(dbstring), "dbname=%s%s%s%s%s user=%s password=%s", config->sql_db, host, config->sql_server, port, config->sql_port, config->sql_login, config->sql_password); conn->db = PQconnectdb(dbstring); if (PQstatus(conn->db) != CONNECTION_OK) { ERROR("rlm_sql_postgresql: Couldn't connect socket to " "PostgreSQL server %s@%s:%s", config->sql_login, config->sql_server, config->sql_db); return -1; } return 0; }
PDOPgSql::PDOPgSql() : PDODriver("pgsql") { PQinitSSL(0); }
/*! * \brief Create a new connection * * Create a new connection structure in private memory, open the PostgreSQL * connection and set reference count to 1 * \param id database id * \return postgres connection structure, 0 on error */ struct pg_con* db_postgres_new_connection(struct db_id* id) { struct pg_con* ptr; char *ports; int i = 0; const char *keywords[10], *values[10]; char to[16]; LM_DBG("db_id = %p\n", id); if (!id) { LM_ERR("invalid db_id parameter value\n"); return 0; } ptr = (struct pg_con*)pkg_malloc(sizeof(struct pg_con)); if (!ptr) { LM_ERR("failed trying to allocated %lu bytes for connection structure." "\n", (unsigned long)sizeof(struct pg_con)); return 0; } LM_DBG("%p=pkg_malloc(%lu)\n", ptr, (unsigned long)sizeof(struct pg_con)); memset(ptr, 0, sizeof(struct pg_con)); ptr->ref = 1; memset(keywords, 0, (sizeof(char*) * 10)); memset(values, 0, (sizeof(char*) * 10)); memset(to, 0, (sizeof(char) * 16)); if (id->port) { ports = int2str(id->port, 0); keywords[i] = "port"; values[i++] = ports; LM_DBG("opening connection: postgres://xxxx:xxxx@%s:%d/%s\n", ZSW(id->host), id->port, ZSW(id->database)); } else { ports = NULL; LM_DBG("opening connection: postgres://xxxx:xxxx@%s/%s\n", ZSW(id->host), ZSW(id->database)); } keywords[i] = "host"; values[i++] = id->host; keywords[i] = "dbname"; values[i++] = id->database; keywords[i] = "user"; values[i++] = id->username; keywords[i] = "password"; values[i++] = id->password; if (pg_timeout > 0) { snprintf(to, sizeof(to)-1, "%d", pg_timeout + 3); keywords[i] = "connect_timeout"; values[i++] = to; } keywords[i] = values[i] = NULL; /* don't attempt to re-init openssl if done already */ if(tls_loaded()) PQinitSSL(0); ptr->con = PQconnectdbParams(keywords, values, 1); LM_DBG("PQconnectdbParams(%p)\n", ptr->con); if( (ptr->con == 0) || (PQstatus(ptr->con) != CONNECTION_OK) ) { LM_ERR("%s\n", PQerrorMessage(ptr->con)); PQfinish(ptr->con); goto err; } ptr->connected = 1; ptr->timestamp = time(0); ptr->id = id; #if defined(SO_KEEPALIVE) && defined(TCP_KEEPIDLE) if (pg_keepalive) { i = 1; setsockopt(PQsocket(ptr->con), SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i)); setsockopt(PQsocket(ptr->con), IPPROTO_TCP, TCP_KEEPIDLE, &pg_keepalive, sizeof(pg_keepalive)); } #endif return ptr; err: if (ptr) { LM_ERR("cleaning up %p=pkg_free()\n", ptr); pkg_free(ptr); } return 0; }