Skip to content

Commit

Permalink
Merge pull request #1682 from sysown/v2.0.0-ch
Browse files Browse the repository at this point in the history
Support for Clickhouse in 2.0
  • Loading branch information
Nick Vyzas authored Sep 10, 2018
2 parents 42a0e7c + f4b2ef2 commit a20617e
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 a20617e

Please sign in to comment.