1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-09-25 14:42:52 +00:00

Fix memory usage issues when checking share permission.

This commit is contained in:
Jonathan Xu
2017-08-25 19:48:29 +08:00
parent a87db5b58e
commit 3cd87afd70

View File

@@ -37,23 +37,16 @@ check_repo_share_perm_cb (SeafDBRow *row, void *data)
} }
static char * static char *
check_repo_share_permission (SeafRepoManager *mgr, check_group_permission_by_user (SeafRepoManager *mgr,
const char *repo_id, const char *repo_id,
const char *user_name) const char *user_name)
{ {
char *permission = NULL;
SearpcClient *rpc_client; SearpcClient *rpc_client;
GList *groups, *p1; GList *groups = NULL, *p1;
CcnetGroup *group; CcnetGroup *group;
int group_id; int group_id;
char *permission; GString *sql;
GString *sql = NULL;
permission = seaf_share_manager_check_permission (seaf->share_mgr,
repo_id,
user_name);
if (permission != NULL)
return permission;
g_free (permission);
rpc_client = ccnet_create_pooled_rpc_client (seaf->client_pool, rpc_client = ccnet_create_pooled_rpc_client (seaf->client_pool,
NULL, NULL,
@@ -63,10 +56,9 @@ check_repo_share_permission (SeafRepoManager *mgr,
/* Get the groups this user belongs to. */ /* Get the groups this user belongs to. */
groups = ccnet_get_groups_by_user (rpc_client, user_name); groups = ccnet_get_groups_by_user (rpc_client, user_name);
if (!groups) if (!groups) {
goto group_out; goto out;
}
ccnet_rpc_client_free (rpc_client);
sql = g_string_new (""); sql = g_string_new ("");
g_string_printf (sql, "SELECT permission FROM RepoGroup WHERE repo_id = ? AND group_id IN ("); g_string_printf (sql, "SELECT permission FROM RepoGroup WHERE repo_id = ? AND group_id IN (");
@@ -84,15 +76,32 @@ check_repo_share_permission (SeafRepoManager *mgr,
check_repo_share_perm_cb, &permission, check_repo_share_perm_cb, &permission,
1, "string", repo_id) < 0) { 1, "string", repo_id) < 0) {
seaf_warning ("DB error when get repo share permission for repo %s.\n", repo_id); seaf_warning ("DB error when get repo share permission for repo %s.\n", repo_id);
goto group_out;
} }
group_out:
g_string_free (sql, TRUE); g_string_free (sql, TRUE);
out:
ccnet_rpc_client_free (rpc_client);
for (p1 = groups; p1 != NULL; p1 = p1->next) for (p1 = groups; p1 != NULL; p1 = p1->next)
g_object_unref ((GObject *)p1->data); g_object_unref ((GObject *)p1->data);
g_list_free (groups); g_list_free (groups);
return permission;
}
static char *
check_repo_share_permission (SeafRepoManager *mgr,
const char *repo_id,
const char *user_name)
{
char *permission;
permission = seaf_share_manager_check_permission (seaf->share_mgr,
repo_id,
user_name);
if (permission != NULL)
return permission;
permission = check_group_permission_by_user (mgr, repo_id, user_name);
if (permission != NULL) if (permission != NULL)
return permission; return permission;