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; } }
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); } } }
/* * 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; }