예제 #1
0
파일: pg.c 프로젝트: RapsIn4/pg
/*
 * 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;
}
예제 #4
0
PDOPgSql::PDOPgSql() : PDODriver("pgsql") {
    PQinitSSL(0);
}
예제 #5
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;
}