Ejemplo n.º 1
0
void
pool_mbr_init(TDS_POOL * pool)
{
	TDS_POOL_MEMBER *pmbr;
	int i;

	/* allocate room for pool members */

	pool->members = (TDS_POOL_MEMBER *)
		calloc(pool->num_members, sizeof(TDS_POOL_MEMBER));

	/* open connections for each member */

	for (i = 0; i < pool->num_members; i++) {
		pmbr = &pool->members[i];
		if (i < pool->min_open_conn) {
			pmbr->tds = pool_mbr_login(pool);
			pmbr->last_used_tm = time(NULL);
			if (!pmbr->tds) {
				fprintf(stderr, "Could not open initial connection %d\n", i);
				exit(1);
			}
		}
		pmbr->state = TDS_IDLE;
	}
}
Ejemplo n.º 2
0
void
pool_mbr_init(TDS_POOL * pool)
{
	TDS_POOL_MEMBER *pmbr;
	int i;

	/* allocate room for pool members */

	pool->members = (TDS_POOL_MEMBER *)
		calloc(pool->num_members, sizeof(TDS_POOL_MEMBER));

	/* open connections for each member */

	for (i = 0; i < pool->num_members; i++) {
		pmbr = &pool->members[i];
		pmbr->state = TDS_IDLE;
		if (i >= pool->min_open_conn)
			continue;

		pmbr->tds = pool_mbr_login(pool);
		pmbr->last_used_tm = time(NULL);
		if (!pmbr->tds) {
			fprintf(stderr, "Could not open initial connection %d\n", i);
			exit(1);
		}
		if (!IS_TDS71_PLUS(pmbr->tds->conn)) {
			fprintf(stderr, "Current pool implementation does not support protocol versions former than 7.1\n");
			exit(1);
		}
	}
}
Ejemplo n.º 3
0
/*
 * pool_find_idle_member
 * returns the first pool member in TDS_IDLE state
 */
TDS_POOL_MEMBER *
pool_find_idle_member(TDS_POOL * pool)
{
	int i, active_members;
	TDS_POOL_MEMBER *pmbr;

	active_members = 0;
	for (i = 0; i < pool->num_members; i++) {
		pmbr = &pool->members[i];
		if (pmbr->tds) {
			active_members++;
			if (pmbr->current_user == NULL) {
				/*
				 * make sure member wasn't idle more that the timeout 
				 * otherwise it'll send the query and close leaving a
				 * hung client
				 */
				pmbr->last_used_tm = time(NULL);
				return pmbr;
			}
		}
	}
	/* if we have dead connections we can open */
	if (active_members < pool->num_members) {
		pmbr = NULL;
		for (i = 0; i < pool->num_members; i++) {
			pmbr = &pool->members[i];
			if (!pmbr->tds) {
				fprintf(stderr, "No open connections left, opening member number %d\n", i);
				pmbr->tds = pool_mbr_login(pool);
				if (pmbr->tds && !IS_TDS71_PLUS(pmbr->tds->conn)) {
					tds_free_socket(pmbr->tds);
					pmbr->tds = NULL;
				}
				pmbr->last_used_tm = time(NULL);
				break;
			}
		}
		if (pmbr)
			return pmbr;
	}
	fprintf(stderr, "No idle members left, increase MAX_POOL_CONN\n");
	return NULL;
}