You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/lib/mysql_connection_pool.cpp

84 lines
2.3 KiB

#include "proxysql.h"
#include "cpp.h"
MyConnArray::MyConnArray(const char *__hostname, const char *__username, const char *__password, const char *__db, unsigned int __port) {
hostname=strdup(__hostname);
username=strdup(__username);
password=strdup(__password);
db=strdup(__db);
port=__port;
free_conns= new PtrArray();
}
MyConnArray * MyConnArray::match(const char *__hostname, const char *__username, const char *__password, const char *__db, unsigned int __port) {
MyConnArray *ret=NULL;
if (
(strcmp(hostname,__hostname)==0) &&
(strcmp(username,__username)==0) &&
(strcmp(password,__password)==0) &&
(strcmp(db,__db)==0) &&
(port==__port)
) { // we found the matching hostname/username/password/port
ret=this;
}
return ret;
}
MyConnArray::~MyConnArray() {
delete free_conns;
}
void MyConnArray::add(MySQL_Connection *myc) {
myc->MCA=this;
free_conns->add((void *)myc);
}
MyConnArray * MySQL_Connection_Pool::MyConnArray_find(const char *hostname, const char *username, const char *password, const char *db, unsigned int port) {
unsigned int l;
MyConnArray *rc=NULL;
for (l=0; l<MyConnArrays->len; l++) {
MyConnArray *mca=(MyConnArray *)MyConnArrays->index(l);
if (mca->match(hostname,username,password,db,port)) { // we found the matching hostname/username/password/port
rc=mca;
break;
}
}
return rc;
}
MyConnArray * MySQL_Connection_Pool::MyConnArray_create(const char *hostname, const char *username, const char *password, const char *db, unsigned int port) {
MyConnArray *MCA= new MyConnArray(hostname, username, password, db, port);
MyConnArrays->add(MCA);
return MCA;
}
MyConnArray * MySQL_Connection_Pool::MyConnArray_lookup(const char *hostname, const char *username, const char *password, const char *db, unsigned int port) {
MyConnArray *MCA=NULL;
if (shared) {
spin_lock(&mutex);
}
MCA=MyConnArray_find(hostname, username, password, db, port);
if (MCA==NULL) {
MCA=MyConnArray_create(hostname, username, password, db, port);
}
if (shared) {
spin_unlock(&mutex);
}
return MCA;
}
MySQL_Connection_Pool::MySQL_Connection_Pool(int _shared) {
shared=_shared;
spinlock_init(&mutex);
MyConnArrays= new PtrArray();
}
MySQL_Connection_Pool::~MySQL_Connection_Pool() {
// TODO: destroy every entry
delete MyConnArrays;
}