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.cpp

195 lines
4.6 KiB

#include "proxysql.h"
#include "cpp.h"
#include "SpookyV2.h"
/*
void * MySQL_Connection::operator new(size_t size) {
return l_alloc(size);
}
void MySQL_Connection::operator delete(void *ptr) {
l_free(sizeof(MySQL_Connection),ptr);
}
*/
//extern __thread char *mysql_thread___default_schema;
MySQL_Connection_userinfo::MySQL_Connection_userinfo() {
username=NULL;
password=NULL;
schemaname=NULL;
hash=0;
//schemaname=strdup(mysql_thread___default_schema);
}
MySQL_Connection_userinfo::~MySQL_Connection_userinfo() {
if (username) free(username);
if (password) free(password);
if (schemaname) free(schemaname);
}
uint64_t MySQL_Connection_userinfo::compute_hash() {
int l=0;
if (username)
l+=strlen(username);
if (password)
l+=strlen(password);
if (schemaname)
l+=strlen(schemaname);
// two random seperator
#define _COMPUTE_HASH_DEL1_ "-ujhtgf76y576574fhYTRDF345wdt-"
#define _COMPUTE_HASH_DEL2_ "-8k7jrhtrgJHRgrefgreyhtRFewg6-"
l+=strlen(_COMPUTE_HASH_DEL1_);
l+=strlen(_COMPUTE_HASH_DEL2_);
char *buf=(char *)malloc(l);
l=0;
if (username) {
strcpy(buf+l,username);
l+=strlen(username);
}
strcpy(buf+l,_COMPUTE_HASH_DEL1_);
l+=strlen(_COMPUTE_HASH_DEL1_);
if (password) {
strcpy(buf+l,password);
l+=strlen(password);
}
if (schemaname) {
strcpy(buf+l,schemaname);
l+=strlen(schemaname);
}
strcpy(buf+l,_COMPUTE_HASH_DEL2_);
l+=strlen(_COMPUTE_HASH_DEL2_);
hash=SpookyHash::Hash64(buf,l,0);
free(buf);
return hash;
}
void MySQL_Connection_userinfo::set(char *u, char *p, char *s) {
if (u) {
if (username) free(username);
username=strdup(u);
}
if (p) {
if (password) free(password);
password=strdup(p);
}
if (s) {
if (schemaname) free(schemaname);
schemaname=strdup(s);
}
compute_hash();
}
void MySQL_Connection_userinfo::set(MySQL_Connection_userinfo *ui) {
set(ui->username, ui->password, ui->schemaname);
}
bool MySQL_Connection_userinfo::set_schemaname(char *_new, int l) {
if ((schemaname==NULL) || (strncmp(_new,schemaname,l))) {
if (schemaname) free(schemaname);
schemaname=(char *)malloc(l+1);
memcpy(schemaname,_new,l);
schemaname[l]=0;
compute_hash();
return true;
}
return false;
}
MySQL_Connection::MySQL_Connection() {
//memset(&myconn,0,sizeof(MYSQL));
myds=NULL;
inserted_into_pool=0;
reusable=false;
has_prepared_statement=false;
processing_prepared_statement_prepare=false;
processing_prepared_statement_execute=false;
parent=NULL;
userinfo=new MySQL_Connection_userinfo();
fd=-1;
status_flags=0;
options.compression_min_length=0;
options.server_version=NULL;
compression_pkt_id=0;
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Creating new MySQL_Connection %p\n", this);
};
MySQL_Connection::~MySQL_Connection() {
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Destroying MySQL_Connection %p\n", this);
if (options.server_version) free(options.server_version);
if (userinfo) {
delete userinfo;
userinfo=NULL;
}
if (myds) {
myds->shut_hard();
} else {
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "MySQL_Connection %p , fd:%d\n", this, fd);
shutdown(fd, SHUT_RDWR);
close(fd);
}
};
uint8_t MySQL_Connection::set_charset(uint8_t _c) {
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Setting charset %d\n", _c);
options.charset=_c;
return _c;
}
bool MySQL_Connection::is_expired(unsigned long long timeout) {
// FIXME: here the check should be a sanity check
// FIXME: for now this is just a temporary (and stupid) check
return false;
}
void MySQL_Connection::set_status_transaction(bool v) {
if (v) {
status_flags |= STATUS_MYSQL_CONNECTION_TRANSACTION;
} else {
status_flags &= ~STATUS_MYSQL_CONNECTION_TRANSACTION;
}
}
void MySQL_Connection::set_status_compression(bool v) {
if (v) {
status_flags |= STATUS_MYSQL_CONNECTION_COMPRESSION;
} else {
status_flags &= ~STATUS_MYSQL_CONNECTION_COMPRESSION;
}
}
void MySQL_Connection::set_status_user_variable(bool v) {
if (v) {
status_flags |= STATUS_MYSQL_CONNECTION_USER_VARIABLE;
} else {
status_flags &= ~STATUS_MYSQL_CONNECTION_USER_VARIABLE;
}
}
void MySQL_Connection::set_status_prepared_statement(bool v) {
if (v) {
status_flags |= STATUS_MYSQL_CONNECTION_PREPARED_STATEMENT;
} else {
status_flags &= ~STATUS_MYSQL_CONNECTION_PREPARED_STATEMENT;
}
}
bool MySQL_Connection::get_status_transaction() {
return status_flags & STATUS_MYSQL_CONNECTION_TRANSACTION;
}
bool MySQL_Connection::get_status_compression() {
return status_flags & STATUS_MYSQL_CONNECTION_COMPRESSION;
}
bool MySQL_Connection::get_status_user_variable() {
return status_flags & STATUS_MYSQL_CONNECTION_USER_VARIABLE;
}
bool MySQL_Connection::get_status_prepared_statement() {
return status_flags & STATUS_MYSQL_CONNECTION_PREPARED_STATEMENT;
}