GList * seaf_repo_manager_get_virtual_repos_by_owner (SeafRepoManager *mgr, const char *owner, GError **error) { GList *id_list = NULL, *ptr; GList *ret = NULL; char *sql; sql = "SELECT RepoOwner.repo_id FROM RepoOwner, VirtualRepo " "WHERE owner_id=? " "AND RepoOwner.repo_id = VirtualRepo.repo_id"; if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_virtual_repo_ids, &id_list, 1, "string", owner) < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "DB error"); return NULL; } char *repo_id; SeafRepo *repo; for (ptr = id_list; ptr; ptr = ptr->next) { repo_id = ptr->data; repo = seaf_repo_manager_get_repo (mgr, repo_id); if (repo != NULL) ret = g_list_prepend (ret, repo); } string_list_free (id_list); return ret; }
GList * seaf_share_manager_list_repo_shared_group (SeafShareManager *mgr, const char *from_email, const char *repo_id, GError **error) { GList *shared_group = NULL; char *sql = "SELECT group_id, permission, repo_id FROM RepoGroup WHERE " "user_name=? AND repo_id=?"; int ret = seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_repo_shared_group, &shared_group, 2, "string", from_email, "string", repo_id); if (ret < 0) { seaf_warning ("Failed to list repo %s shared group from db.\n", repo_id); g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Failed to list repo shared group from db"); while (shared_group) { g_object_unref (shared_group->data); shared_group = g_list_delete_link (shared_group, shared_group); } return NULL; } return shared_group; }
gint64 seaf_quota_manager_get_user_usage (SeafQuotaManager *mgr, const char *user) { char *sql; gint64 total = 0; sql = "SELECT size FROM " "RepoOwner o LEFT JOIN VirtualRepo v ON o.repo_id=v.repo_id, " "RepoSize WHERE " "owner_id=? AND o.repo_id=RepoSize.repo_id " "AND v.repo_id IS NULL"; if (seaf_db_statement_foreach_row (mgr->session->db, sql, get_total_size, &total, 1, "string", user) < 0) return -1; /* Add size of repos in trash. */ /* sql = "SELECT size FROM RepoTrash WHERE owner_id = ?"; */ /* if (seaf_db_statement_foreach_row (mgr->session->db, sql, */ /* get_total_size, &total, */ /* 1, "string", user) < 0) */ /* return -1; */ return total; }
GHashTable * seaf_share_manager_get_shared_sub_dirs (SeafShareManager *mgr, const char *repo_id, const char *path) { GHashTable *sub_dirs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); char *pattern; if (strcmp (path, "/") == 0) { pattern = g_strdup_printf("%s%%", path); } else { pattern = g_strdup_printf ("%s/%%", path); } int ret = seaf_db_statement_foreach_row (mgr->seaf->db, "SELECT v.path FROM VirtualRepo v, SharedRepo s " "WHERE v.repo_id = s.repo_id and " "v.origin_repo = ? AND v.path LIKE ?", get_shared_sub_dirs, sub_dirs, 2, "string", repo_id, "string", pattern); if (ret < 0) { g_free (pattern); seaf_warning ("Failed to get shared sub dirs from db.\n"); g_hash_table_destroy (sub_dirs); return NULL; } ret = seaf_db_statement_foreach_row (mgr->seaf->db, "SELECT v.path FROM VirtualRepo v, RepoGroup r " "WHERE v.repo_id = r.repo_id and " "v.origin_repo = ? AND v.path LIKE ?", get_shared_sub_dirs, sub_dirs, 2, "string", repo_id, "string", pattern); g_free (pattern); if (ret < 0) { seaf_warning ("Failed to get shared sub dirs from db.\n"); g_hash_table_destroy (sub_dirs); return NULL; } return sub_dirs; }
SeafVirtRepo * seaf_repo_manager_get_virtual_repo_info (SeafRepoManager *mgr, const char *repo_id) { char *sql; SeafVirtRepo *vinfo = NULL; sql = "SELECT repo_id, origin_repo, path, base_commit FROM VirtualRepo " "WHERE repo_id = ?"; seaf_db_statement_foreach_row (seaf->db, sql, load_virtual_info, &vinfo, 1, "string", repo_id); return vinfo; }
gint64 seaf_quota_manager_get_org_usage (SeafQuotaManager *mgr, int org_id) { char *sql; gint64 ret = 0; sql = "SELECT size FROM OrgRepo, RepoSize WHERE " "org_id=? AND OrgRepo.repo_id=RepoSize.repo_id"; if (seaf_db_statement_foreach_row (mgr->session->db, sql, get_total_size, &ret, 1, "int", org_id) < 0) return -1; return ret; }
GList * seaf_repo_manager_get_virtual_repo_ids_by_origin (SeafRepoManager *mgr, const char *origin_repo) { GList *ret = NULL; char *sql; sql = "SELECT repo_id FROM VirtualRepo WHERE origin_repo=?"; if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_virtual_repo_ids, &ret, 1, "string", origin_repo) < 0) { return NULL; } return g_list_reverse (ret); }
GList * seaf_branch_manager_get_branch_list (SeafBranchManager *mgr, const char *repo_id) { GList *ret = NULL; char *sql; sql = "SELECT name, repo_id, commit_id FROM Branch WHERE repo_id=?"; if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, get_branches, &ret, 1, "string", repo_id) < 0) { seaf_warning ("[branch mgr] DB error when get branch list.\n"); return NULL; } return ret; }
GList * seaf_share_manager_list_shared_to (SeafShareManager *mgr, const char *owner, const char *repo_id) { char *sql; GList *ret = NULL; sql = "SELECT to_email FROM SharedRepo WHERE " "from_email=? AND repo_id=?"; if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_shared_to, &ret, 2, "string", owner, "string", repo_id) < 0) { seaf_warning ("[share mgr] DB error when list shared to.\n"); string_list_free (ret); return NULL; } return ret; }
static SeafBranch * real_get_branch (SeafBranchManager *mgr, const char *repo_id, const char *name) { char commit_id[41]; char *sql; commit_id[0] = 0; sql = "SELECT commit_id FROM Branch WHERE name=? AND repo_id=?"; if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, get_branch, commit_id, 2, "string", name, "string", repo_id) < 0) { seaf_warning ("[branch mgr] DB error when get branch %s.\n", name); return NULL; } if (commit_id[0] == 0) return NULL; return seaf_branch_new (name, repo_id, commit_id); }
GList* seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, const char *type, int start, int limit) { GList *ret = NULL, *p; char *sql; if (start == -1 && limit == -1) { if (g_strcmp0 (type, "from_email") == 0) { sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "to_email, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path FROM " "SharedRepo LEFT JOIN VirtualRepo ON " "SharedRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch " "WHERE from_email=? AND " "SharedRepo.repo_id = Branch.repo_id AND " "Branch.name = 'master'"; } else if (g_strcmp0 (type, "to_email") == 0) { sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "from_email, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path FROM " "SharedRepo LEFT JOIN VirtualRepo on SharedRepo.repo_id = VirtualRepo.repo_id " "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch " "WHERE to_email=? AND " "SharedRepo.repo_id = Branch.repo_id AND " "Branch.name = 'master'"; } else { /* should never reach here */ seaf_warning ("[share mgr] Wrong column type"); return NULL; } if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_repos, &ret, 1, "string", email) < 0) { seaf_warning ("[share mgr] DB error when get shared repo id and email " "for %s.\n", email); for (p = ret; p; p = p->next) g_object_unref (p->data); g_list_free (ret); return NULL; } } else { if (g_strcmp0 (type, "from_email") == 0) { sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "to_email, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path FROM " "SharedRepo LEFT JOIN VirtualRepo ON " "SharedRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, Branch " "WHERE from_email=? " "AND SharedRepo.repo_id = Branch.repo_id " "AND Branch.name = 'master' " "ORDER BY SharedRepo.repo_id " "LIMIT ? OFFSET ?"; } else if (g_strcmp0 (type, "to_email") == 0) { sql = "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "from_email, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path FROM " "SharedRepo LEFT JOIN VirtualRepo on SharedRepo.repo_id = VirtualRepo.repo_id " "LEFT JOIN RepoSize s ON SharedRepo.repo_id = s.repo_id, " "Branch WHERE to_email=? " "AND SharedRepo.repo_id = Branch.repo_id " "AND Branch.name = 'master' " "ORDER BY SharedRepo.repo_id " "LIMIT ? OFFSET ?"; } else { /* should never reach here */ seaf_warning ("[share mgr] Wrong column type"); return NULL; } if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_repos, &ret, 3, "string", email, "int", limit, "int", start) < 0) { seaf_warning ("[share mgr] DB error when get shared repo id and email " "for %s.\n", email); for (p = ret; p; p = p->next) g_object_unref (p->data); g_list_free (ret); return NULL; } } seaf_fill_repo_obj_from_commit (&ret); return g_list_reverse (ret); }