From 063d20ce8dc67498cf679247d98e3acdec7a7744 Mon Sep 17 00:00:00 2001 From: cuihaikuo Date: Mon, 27 Feb 2017 15:15:44 +0800 Subject: [PATCH] Add rpc for setting role quota --- net/common/rpc-service.c | 19 +++++++++++- net/common/rpc-service.h | 3 ++ net/server/user-mgr.c | 62 ++++++++++++++++++++++++++++++++++++++++ net/server/user-mgr.h | 9 ++++++ python/ccnet/rpc.py | 4 +++ 5 files changed, 96 insertions(+), 1 deletion(-) diff --git a/net/common/rpc-service.c b/net/common/rpc-service.c index 5c725b6..d4c787c 100644 --- a/net/common/rpc-service.c +++ b/net/common/rpc-service.c @@ -108,7 +108,7 @@ ccnet_start_rpc(CcnetSession *session) ccnet_rpc_remove_role, "remove_role", searpc_signature_int__string_string()); - + searpc_server_register_function ("ccnet-rpcserver", ccnet_rpc_get_config, @@ -280,6 +280,10 @@ ccnet_start_rpc(CcnetSession *session) ccnet_rpc_search_groups, "search_groups", searpc_signature_objlist__string_int_int()); + searpc_server_register_function ("ccnet-threaded-rpcserver", + ccnet_rpc_set_role_quota, + "set_role_quota", + searpc_signature_int__string_int64()); searpc_server_register_function ("ccnet-threaded-rpcserver", ccnet_rpc_create_org, @@ -1564,5 +1568,18 @@ ccnet_rpc_set_org_name (int org_id, const char *org_name, GError **error) return ccnet_org_manager_set_org_name (org_mgr, org_id, org_name, error); } +int +ccnet_rpc_set_role_quota (const char *role, gint64 quota, GError **error) +{ + CcnetUserManager *user_mgr = + ((CcnetServerSession *)session)->user_mgr; + + if (quota < 0 || !role) { + g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Bad arguments"); + return -1; + } + + return ccnet_user_manager_set_role_quota (user_mgr, role, quota); +} #endif /* CCNET_SERVER */ diff --git a/net/common/rpc-service.h b/net/common/rpc-service.h index 88cf92e..87aae3e 100644 --- a/net/common/rpc-service.h +++ b/net/common/rpc-service.h @@ -320,4 +320,7 @@ ccnet_rpc_login_relay (const char *relay_id, const char *email, int ccnet_rpc_logout_relay (const char *relay_id, GError **error); +int +ccnet_rpc_set_role_quota (const char *role, gint64 quota, GError **error); + #endif /* RPC_SERVICE_H */ diff --git a/net/server/user-mgr.c b/net/server/user-mgr.c index bc312f1..0a794b2 100644 --- a/net/server/user-mgr.c +++ b/net/server/user-mgr.c @@ -564,6 +564,12 @@ static int check_db_table (CcnetDB *db) if (ccnet_db_query (db, sql) < 0) return -1; + sql = "CREATE TABLE IF NOT EXISTS RoleQuota (" + "role VARCHAR(255) NOT NULL PRIMARY KEY, " + "quota BIGINT, UNIQUE INDEX(role)) ENGINE=INNODB"; + if (ccnet_db_query (db, sql) < 0) + return -1; + } else if (db_type == CCNET_DB_TYPE_SQLITE) { sql = "CREATE TABLE IF NOT EXISTS EmailUser (" "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," @@ -611,6 +617,16 @@ static int check_db_table (CcnetDB *db) if (ccnet_db_query (db, sql) < 0) return -1; + sql = "CREATE TABLE IF NOT EXISTS RoleQuota (" + "role TEXT NOT NULL PRIMARY KEY, " + "quota BIGINT)"; + if (ccnet_db_query (db, sql) < 0) + return -1; + + sql = "CREATE UNIQUE INDEX IF NOT EXISTS rolequota_index on RoleQuota (role)"; + if (ccnet_db_query (db, sql) < 0) + return -1; + } else if (db_type == CCNET_DB_TYPE_PGSQL) { sql = "CREATE TABLE IF NOT EXISTS EmailUser (" "id SERIAL PRIMARY KEY, " @@ -647,6 +663,11 @@ static int check_db_table (CcnetDB *db) if (ccnet_db_query (db, sql) < 0) return -1; } + + sql = "CREATE TABLE IF NOT EXISTS RoleQuota (" + "role VARCHAR(255) NOT NULL, quota BIGINT, UNIQUE (role))"; + if (ccnet_db_query (db, sql) < 0) + return -1; } return 0; @@ -1696,3 +1717,44 @@ ccnet_user_manager_get_superusers(CcnetUserManager *manager) return g_list_reverse (ret); } + +int +ccnet_user_manager_set_role_quota (CcnetUserManager *manager, + const char *role, + gint64 quota) +{ + CcnetDB *db = manager->priv->db; + gint64 old_quota = ccnet_user_manager_get_role_quota (manager, role); + if (old_quota > 0) + return ccnet_db_statement_query (db, "UPDATE RoleQuota SET quota=? " + "WHERE role=?", + 2, "int64", quota, "string", role); + else + return ccnet_db_statement_query (db, "INSERT INTO RoleQuota(role, quota)" + " VALUES (?, ?)", + 2, "string", role, "int64", quota); +} + +static gboolean +get_role_quota_cb (CcnetDBRow *row, void *data) +{ + *((gint64 **)data) = ccnet_db_row_get_column_int64 (row, 0); + + return FALSE; +} + +gint64 +ccnet_user_manager_get_role_quota (CcnetUserManager *manager, + const char *role) +{ + CcnetDB *db = manager->priv->db; + const char *sql; + gint64 quota; + + sql = "SELECT quota FROM RoleQuota WHERE role=?"; + if (ccnet_db_statement_foreach_row (db, sql, get_role_quota_cb, "a, + 1, "string", role) > 0) + return quota; + + return -1; +} diff --git a/net/server/user-mgr.h b/net/server/user-mgr.h index d6b8e1d..10cdc50 100644 --- a/net/server/user-mgr.h +++ b/net/server/user-mgr.h @@ -154,4 +154,13 @@ ccnet_user_manager_get_binding_email (CcnetUserManager *manager, const char *pee GList * ccnet_user_manager_get_binding_peerids (CcnetUserManager *manager, const char *email); +gint64 +ccnet_user_manager_get_role_quota (CcnetUserManager *manager, + const char *role); + +int +ccnet_user_manager_set_role_quota (CcnetUserManager *manager, + const char *role, + gint64 quota); + #endif diff --git a/python/ccnet/rpc.py b/python/ccnet/rpc.py index e2d3a22..41b86b5 100644 --- a/python/ccnet/rpc.py +++ b/python/ccnet/rpc.py @@ -331,6 +331,10 @@ class CcnetThreadedRpcClient(RpcClientBase): def search_groups(self, group_patt, start, limit): pass + @searpc_func("int", ["string", "int64"]) + def set_role_quota(self, role, quota): + pass + @searpc_func("int", ["string", "string", "string"]) def create_org(self, org_name, url_prefix, creator): pass