Skip to content

Commit

Permalink
Support for Clickhouse in 2.0
Browse files Browse the repository at this point in the history
Support for Clickhouse wasn't able to compile due to conflicting definition
after the introduction of mysql_users.comment column
  • Loading branch information
renecannao committed Sep 10, 2018
1 parent 42a0e7c commit f4b2ef2
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 51 deletions.
30 changes: 15 additions & 15 deletions include/ClickHouse_Authentication.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

#define PROXYSQL_AUTH_PTHREAD_MUTEX

#ifndef ACCOUNT_DETAILS_T
#define ACCOUNT_DETAILS_T
typedef struct _account_details_t {
#ifndef CH_ACCOUNT_DETAILS_T
#define CH_ACCOUNT_DETAILS_T
typedef struct _ch_account_details_t {
char *username;
char *password;
void *sha1_pass;
Expand All @@ -23,10 +23,10 @@ typedef struct _account_details_t {
bool __frontend; // this is used only during the dump
bool __backend; // this is used only during the dump
bool __active;
} account_details_t;
} ch_account_details_t;

typedef std::map<uint64_t, account_details_t *> umap_auth;
#endif // ACCOUNT_DETAILS_T
typedef std::map<uint64_t, ch_account_details_t *> ch_umap_auth;
#endif // CH_ACCOUNT_DETAILS_T

#ifdef DEBUG
#define DEB "_DEBUG"
Expand All @@ -37,23 +37,23 @@ typedef std::map<uint64_t, account_details_t *> umap_auth;

class PtrArray;

#ifndef CREDS_GROUPS_T
#define CREDS_GROUPS_T
typedef struct _creds_group_t {
#ifndef CH_CREDS_GROUPS_T
#define CH_CREDS_GROUPS_T
typedef struct _ch_creds_group_t {
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_t lock;
#else
rwlock_t lock;
#endif
umap_auth bt_map;
ch_umap_auth bt_map;
PtrArray *cred_array;
} creds_group_t;
#endif // CREDS_GROUPS_T
} ch_creds_group_t;
#endif // CH_CREDS_GROUPS_T

class ClickHouse_Authentication {
private:
creds_group_t creds_backends;
creds_group_t creds_frontends;
ch_creds_group_t creds_backends;
ch_creds_group_t creds_frontends;
bool _reset(enum cred_username_type usertype);

public:
Expand All @@ -71,7 +71,7 @@ class ClickHouse_Authentication {
bool *use_ssl, int *default_hostgroup, char **default_schema,
bool *schema_locked, bool *transaction_persistent,
bool *fast_forward, int *max_connections, void **sha1_pass);
int dump_all_users(account_details_t ***, bool _complete = true);
int dump_all_users(ch_account_details_t ***, bool _complete = true);
int increase_frontend_user_connections(char *username, int *mc = NULL);
void decrease_frontend_user_connections(char *username);
void set_all_inactive(enum cred_username_type usertype);
Expand Down
66 changes: 33 additions & 33 deletions lib/ClickHouse_Authentication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,15 @@ void ClickHouse_Authentication::print_version() {
};

void ClickHouse_Authentication::set_all_inactive(enum cred_username_type usertype) {
creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
unsigned int i;
for (i=0; i<cg.cred_array->len; i++) {
account_details_t *ado=(account_details_t *)cg.cred_array->index(i);
ch_account_details_t *ado=(ch_account_details_t *)cg.cred_array->index(i);
ado->__active=false;
}
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
Expand All @@ -55,7 +55,7 @@ void ClickHouse_Authentication::set_all_inactive(enum cred_username_type usertyp
}

void ClickHouse_Authentication::remove_inactives(enum cred_username_type usertype) {
creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
Expand All @@ -64,7 +64,7 @@ void ClickHouse_Authentication::remove_inactives(enum cred_username_type usertyp
unsigned int i;
__loop_remove_inactives:
for (i=0; i<cg.cred_array->len; i++) {
account_details_t *ado=(account_details_t *)cg.cred_array->index(i);
ch_account_details_t *ado=(ch_account_details_t *)cg.cred_array->index(i);
if (ado->__active==false) {
del(ado->username,usertype,false);
goto __loop_remove_inactives; // we aren't sure how the underlying structure changes, so we jump back to 0
Expand All @@ -84,17 +84,17 @@ bool ClickHouse_Authentication::add(char * username, char * password, enum cred_
myhash.Update(username,strlen(username));
myhash.Final(&hash1,&hash2);

creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);

#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator lookup;
std::map<uint64_t, ch_account_details_t *>::iterator lookup;
lookup = cg.bt_map.find(hash1);
// few changes will follow, due to issue #802
account_details_t *ad=NULL;
ch_account_details_t *ad=NULL;
bool new_ad=false;
if (lookup != cg.bt_map.end()) {
ad=lookup->second;
Expand All @@ -111,7 +111,7 @@ bool ClickHouse_Authentication::add(char * username, char * password, enum cred_
ad->default_schema=strdup(default_schema);
}
} else {
ad=(account_details_t *)malloc(sizeof(account_details_t));
ad=(ch_account_details_t *)malloc(sizeof(ch_account_details_t));
ad->username=strdup(username);
ad->default_schema=strdup(default_schema);
ad->password=strdup(password);
Expand Down Expand Up @@ -139,7 +139,7 @@ bool ClickHouse_Authentication::add(char * username, char * password, enum cred_
return true;
};

int ClickHouse_Authentication::dump_all_users(account_details_t ***ads, bool _complete) {
int ClickHouse_Authentication::dump_all_users(ch_account_details_t ***ads, bool _complete) {
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_rdlock(&creds_frontends.lock);
pthread_rwlock_rdlock(&creds_backends.lock);
Expand All @@ -150,16 +150,16 @@ int ClickHouse_Authentication::dump_all_users(account_details_t ***ads, bool _co
int total_size;
int idx_=0;
unsigned i=0;
account_details_t **_ads;
ch_account_details_t **_ads;
total_size=creds_frontends.cred_array->len;
if (_complete) {
total_size+=creds_backends.cred_array->len;
}
if (!total_size) goto __exit_dump_all_users;
_ads=(account_details_t **)malloc(sizeof(account_details_t *)*total_size);
_ads=(ch_account_details_t **)malloc(sizeof(ch_account_details_t *)*total_size);
for (i=0; i<creds_frontends.cred_array->len; i++) {
account_details_t *ad=(account_details_t *)malloc(sizeof(account_details_t));
account_details_t *ado=(account_details_t *)creds_frontends.cred_array->index(i);
ch_account_details_t *ad=(ch_account_details_t *)malloc(sizeof(ch_account_details_t));
ch_account_details_t *ado=(ch_account_details_t *)creds_frontends.cred_array->index(i);
ad->username=strdup(ado->username);
ad->max_connections=ado->max_connections;
ad->default_hostgroup=ado->default_hostgroup;
Expand All @@ -185,8 +185,8 @@ int ClickHouse_Authentication::dump_all_users(account_details_t ***ads, bool _co
}
if (_complete==true) {
for (i=0; i<creds_backends.cred_array->len; i++) {
account_details_t *ad=(account_details_t *)malloc(sizeof(account_details_t));
account_details_t *ado=(account_details_t *)creds_backends.cred_array->index(i);
ch_account_details_t *ad=(ch_account_details_t *)malloc(sizeof(ch_account_details_t));
ch_account_details_t *ado=(ch_account_details_t *)creds_backends.cred_array->index(i);
ad->num_connections_used=0;
ad->username=strdup(ado->username);
ad->password=strdup(ado->password);
Expand Down Expand Up @@ -224,17 +224,17 @@ int ClickHouse_Authentication::increase_frontend_user_connections(char *username
myhash->Update(username,strlen(username));
myhash->Final(&hash1,&hash2);
delete myhash;
creds_group_t &cg=creds_frontends;
ch_creds_group_t &cg=creds_frontends;
int ret=0;
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator it;
std::map<uint64_t, ch_account_details_t *>::iterator it;
it = cg.bt_map.find(hash1);
if (it != cg.bt_map.end()) {
account_details_t *ad=it->second;
ch_account_details_t *ad=it->second;
if (ad->max_connections > ad->num_connections_used) {
ret=ad->max_connections-ad->num_connections_used;
ad->num_connections_used++;
Expand All @@ -258,16 +258,16 @@ void ClickHouse_Authentication::decrease_frontend_user_connections(char *usernam
myhash->Update(username,strlen(username));
myhash->Final(&hash1,&hash2);
delete myhash;
creds_group_t &cg=creds_frontends;
ch_creds_group_t &cg=creds_frontends;
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator it;
std::map<uint64_t, ch_account_details_t *>::iterator it;
it = cg.bt_map.find(hash1);
if (it != cg.bt_map.end()) {
account_details_t *ad=it->second;
ch_account_details_t *ad=it->second;
if (ad->num_connections_used > 0) {
ad->num_connections_used--;
}
Expand All @@ -288,18 +288,18 @@ bool ClickHouse_Authentication::del(char * username, enum cred_username_type use
myhash->Final(&hash1,&hash2);
delete myhash;

creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);

if (set_lock)
#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator lookup;
std::map<uint64_t, ch_account_details_t *>::iterator lookup;
lookup = cg.bt_map.find(hash1);
if (lookup != cg.bt_map.end()) {
account_details_t *ad=lookup->second;
ch_account_details_t *ad=lookup->second;
cg.cred_array->remove_fast(ad);
cg.bt_map.erase(lookup);
free(ad->username);
Expand Down Expand Up @@ -327,17 +327,17 @@ bool ClickHouse_Authentication::set_SHA1(char * username, enum cred_username_typ
myhash->Final(&hash1,&hash2);
delete myhash;

creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);

#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator lookup;
std::map<uint64_t, ch_account_details_t *>::iterator lookup;
lookup = cg.bt_map.find(hash1);
if (lookup != cg.bt_map.end()) {
account_details_t *ad=lookup->second;
ch_account_details_t *ad=lookup->second;
if (ad->sha1_pass) { free(ad->sha1_pass); ad->sha1_pass=NULL; }
if (sha_pass) {
ad->sha1_pass=malloc(SHA_DIGEST_LENGTH);
Expand All @@ -361,17 +361,17 @@ char * ClickHouse_Authentication::lookup(char * username, enum cred_username_typ
myhash.Update(username,strlen(username));
myhash.Final(&hash1,&hash2);

creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);

#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_rdlock(&cg.lock);
#else
spin_rdlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator lookup;
std::map<uint64_t, ch_account_details_t *>::iterator lookup;
lookup = cg.bt_map.find(hash1);
if (lookup != cg.bt_map.end()) {
account_details_t *ad=lookup->second;
ch_account_details_t *ad=lookup->second;
ret=l_strdup(ad->password);
if (use_ssl) *use_ssl=ad->use_ssl;
if (default_hostgroup) *default_hostgroup=ad->default_hostgroup;
Expand All @@ -397,19 +397,19 @@ char * ClickHouse_Authentication::lookup(char * username, enum cred_username_typ
}

bool ClickHouse_Authentication::_reset(enum cred_username_type usertype) {
creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);
ch_creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends);

#ifdef PROXYSQL_AUTH_PTHREAD_MUTEX
pthread_rwlock_wrlock(&cg.lock);
#else
spin_wrlock(&cg.lock);
#endif
std::map<uint64_t, account_details_t *>::iterator lookup;
std::map<uint64_t, ch_account_details_t *>::iterator lookup;

while (cg.bt_map.size()) {
lookup = cg.bt_map.begin();
if ( lookup != cg.bt_map.end() ) {
account_details_t *ad=lookup->second;
ch_account_details_t *ad=lookup->second;
cg.bt_map.erase(lookup);
free(ad->username);
free(ad->password);
Expand Down
5 changes: 2 additions & 3 deletions lib/ProxySQL_Admin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6715,7 +6715,7 @@ void ProxySQL_Admin::save_clickhouse_users_runtime_to_database(bool _runtime) {
proxy_debug(PROXY_DEBUG_ADMIN, 4, "%s\n", qd);
admindb->execute(qd);
}
account_details_t **ads=NULL;
ch_account_details_t **ads=NULL;
int num_users;
int i;
/*
Expand Down Expand Up @@ -6750,7 +6750,7 @@ void ProxySQL_Admin::save_clickhouse_users_runtime_to_database(bool _runtime) {
}
for (i=0; i<num_users; i++) {
//fprintf(stderr,"%s %d\n", ads[i]->username, ads[i]->default_hostgroup);
account_details_t *ad=ads[i];
ch_account_details_t *ad=ads[i];
sqlite3_stmt *statement1=NULL;
if (ads[i]->default_hostgroup >= 0) {
char *q=NULL;
Expand Down Expand Up @@ -6799,7 +6799,6 @@ void ProxySQL_Admin::save_clickhouse_users_runtime_to_database(bool _runtime) {
free(ad->username);
free(ad->password); // this is not initialized with dump_all_users( , false)
free(ad->default_schema); // this is not initialized with dump_all_users( , false)
free(ad->comment);
free(ad);
}
if (_runtime) {
Expand Down

0 comments on commit f4b2ef2

Please sign in to comment.