int seaf_quota_manager_check_quota (SeafQuotaManager *mgr, const char *repo_id) { char *user = NULL; int org_id; gint64 quota, usage; int ret = 0; user = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, repo_id); if (user != NULL) { quota = seaf_quota_manager_get_user_quota (mgr, user); } else if (seaf->cloud_mode) { org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, repo_id); if (org_id < 0) { seaf_warning ("Repo %s has no owner.\n", repo_id); ret = -1; goto out; } quota = seaf_quota_manager_get_org_quota (mgr, org_id); } else { seaf_warning ("Repo %s has no owner.\n", repo_id); ret = -1; goto out; } if (quota == INFINITE_QUOTA) goto out; if (user) { if (!mgr->calc_share_usage) { usage = seaf_quota_manager_get_user_usage (mgr, user); } else { gint64 my_usage, share_usage; share_usage = seaf_quota_manager_get_user_share_usage (mgr, user); if (share_usage < 0) { ret = -1; goto out; } my_usage = seaf_quota_manager_get_user_usage (mgr, user); if (my_usage < 0) { ret = -1; goto out; } usage = my_usage + share_usage; } } else usage = seaf_quota_manager_get_org_usage (mgr, org_id); if (usage < 0 || usage >= quota) ret = -1; out: g_free (user); return ret; }
int seaf_quota_manager_check_quota (SeafQuotaManager *mgr, const char *repo_id) { SeafVirtRepo *vinfo; const char *r_repo_id = repo_id; char *user = NULL; int org_id; gint64 quota, usage; int ret = 0; /* If it's a virtual repo, check quota to origin repo. */ vinfo = seaf_repo_manager_get_virtual_repo_info (seaf->repo_mgr, repo_id); if (vinfo) r_repo_id = vinfo->origin_repo_id; user = seaf_repo_manager_get_repo_owner (seaf->repo_mgr, r_repo_id); if (user != NULL) { quota = seaf_quota_manager_get_user_quota (mgr, user); } else if (seaf->cloud_mode) { org_id = seaf_repo_manager_get_repo_org (seaf->repo_mgr, r_repo_id); if (org_id < 0) { seaf_warning ("Repo %s has no owner.\n", r_repo_id); ret = -1; goto out; } quota = seaf_quota_manager_get_org_quota (mgr, org_id); } else { seaf_warning ("Repo %s has no owner.\n", r_repo_id); ret = -1; goto out; } if (quota == INFINITE_QUOTA) goto out; if (user) { if (!mgr->calc_share_usage) { usage = seaf_quota_manager_get_user_usage (mgr, user); } else { gint64 my_usage, share_usage; share_usage = seaf_quota_manager_get_user_share_usage (mgr, user); if (share_usage < 0) { ret = -1; goto out; } my_usage = seaf_quota_manager_get_user_usage (mgr, user); if (my_usage < 0) { ret = -1; goto out; } usage = my_usage + share_usage; } } else usage = seaf_quota_manager_get_org_usage (mgr, org_id); if (usage < 0 || usage >= quota) ret = -1; out: seaf_virtual_repo_info_free (vinfo); g_free (user); return ret; }