GList * seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, const char *email) { GList *id_list = NULL, *ptr; GList *ret = NULL; char sql[256]; snprintf (sql, 256, "SELECT repo_id FROM RepoOwner WHERE owner_id='%s'", email); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repo_id, &id_list) < 0) return NULL; for (ptr = id_list; ptr; ptr = ptr->next) { char *repo_id = ptr->data; SeafRepo *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_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit) { GList *id_list = NULL, *ptr; GList *ret = NULL; SeafRepo *repo; char sql[256]; if (start == -1 && limit == -1) snprintf (sql, 256, "SELECT repo_id FROM Repo"); else snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repo_id, &id_list) < 0) return NULL; for (ptr = id_list; ptr; ptr = ptr->next) { char *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 g_list_reverse (ret); }
GList * seaf_repo_manager_list_garbage_repos (SeafRepoManager *mgr) { GList *repo_ids = NULL; seaf_db_foreach_selected_row (seaf->db, "SELECT repo_id FROM GarbageRepos", get_garbage_repo_id, &repo_ids); return repo_ids; }
GList * seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, gboolean ignore_errors, gboolean *error) { char sql[256]; GList *id_list = NULL, *ptr; GList *ret = NULL; SeafRepo *repo; *error = FALSE; if (start == -1 && limit == -1) snprintf (sql, 256, "SELECT repo_id FROM Repo"); else snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repo_id, &id_list) < 0) goto error; for (ptr = id_list; ptr; ptr = ptr->next) { char *repo_id = ptr->data; repo = seaf_repo_manager_get_repo (mgr, repo_id); if (!repo) { /* In GC, we should be more conservative. * No matter a repo is really corrupted or it's a temp error, * we return error here. */ g_warning ("Failed to get repo %.8s.\n", repo_id); if (!ignore_errors) goto error; else continue; } ret = g_list_prepend (ret, repo); } string_list_free (id_list); return ret; error: *error = TRUE; string_list_free (id_list); for (ptr = ret; ptr; ptr = ptr->next) { repo = ptr->data; seaf_repo_unref (repo); } return NULL; }
GList * seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr) { GList *ret = NULL; char sql[256]; snprintf (sql, 256, "SELECT repo_id FROM Repo"); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repo_id, &ret) < 0) return NULL; return ret; }
SeafVirtRepo * seaf_repo_manager_get_virtual_repo_info (SeafRepoManager *mgr, const char *repo_id) { char sql[256]; SeafVirtRepo *vinfo = NULL; snprintf (sql, 256, "SELECT origin_repo, path, base_commit FROM VirtualRepo " "WHERE repo_id = '%s'", repo_id); seaf_db_foreach_selected_row (seaf->db, sql, load_virtual_info, &vinfo); return vinfo; }
static SeafRepo * load_repo (SeafRepoManager *manager, const char *repo_id) { char sql[256]; int n; SeafRepo *repo = seaf_repo_new(repo_id, NULL, NULL); if (!repo) { g_warning ("[repo mgr] failed to alloc repo.\n"); return NULL; } repo->manager = manager; snprintf(sql, 256, "SELECT branch_name FROM RepoHead WHERE repo_id='%s'", repo->id); n = seaf_db_foreach_selected_row (seaf->db, sql, load_branch_cb, repo); if (n < 0) { g_warning ("Error read branch for repo %s.\n", repo->id); seaf_repo_free (repo); return NULL; } else if (n == 0) { g_warning ("Repo %.8s is corrupted.\n", repo->id); seaf_repo_free (repo); return NULL; } if (repo->is_corrupted) { g_warning ("Repo %.8s is corrupted.\n", repo->id); seaf_repo_free (repo); return NULL; } #if 0 if (pthread_rwlock_wrlock (&manager->priv->lock) < 0) { g_warning ("[repo mgr] failed to lock repo cache.\n"); seaf_repo_free (repo); return NULL; } avl_insert (manager->priv->repo_tree, repo); /* Don't need to increase ref count, since the ref count of * a new repo object is already 1. */ pthread_rwlock_unlock (&manager->priv->lock); #endif return repo; }
gint64 seaf_quota_manager_get_org_usage (SeafQuotaManager *mgr, int org_id) { char sql[256]; gint64 ret = 0; snprintf (sql, sizeof(sql), "SELECT size FROM OrgRepo, RepoSize WHERE " "org_id=%d AND OrgRepo.repo_id=RepoSize.repo_id", org_id); if (seaf_db_foreach_selected_row (mgr->session->db, sql, get_total_size, &ret) < 0) return -1; return ret; }
gint64 seaf_quota_manager_get_user_usage (SeafQuotaManager *mgr, const char *user) { char sql[256]; gint64 ret = 0; snprintf (sql, sizeof(sql), "SELECT size FROM RepoOwner, RepoSize WHERE " "owner_id='%s' AND RepoOwner.repo_id=RepoSize.repo_id", user); if (seaf_db_foreach_selected_row (mgr->session->db, sql, get_total_size, &ret) < 0) return -1; return ret; }
gint64 get_org_quota_usage (SeafileSession *seaf, int org_id) { char sql[256]; gint64 ret = 0; snprintf (sql, sizeof(sql), "SELECT size FROM OrgRepo, RepoSize WHERE " "org_id=%d AND OrgRepo.repo_id=RepoSize.repo_id", org_id); if (seaf_db_foreach_selected_row (seaf->db, sql, get_total_size, &ret) < 0) return -1; return ret; }
gint64 get_user_quota_usage (SeafileSession *seaf, const char *email) { char sql[256]; gint64 ret = 0; snprintf (sql, sizeof(sql), "SELECT size FROM RepoOwner, RepoSize WHERE " "owner_id='%s' AND RepoOwner.repo_id=RepoSize.repo_id", email); if (seaf_db_foreach_selected_row (seaf->db, sql, get_total_size, &ret) < 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[256]; snprintf (sql, 256, "SELECT repo_id FROM VirtualRepo WHERE origin_repo='%s'", origin_repo); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_virtual_repo_ids, &ret) < 0) { return NULL; } return g_list_reverse (ret); }
GList * seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit) { GList *ret = NULL; char sql[256]; if (start == -1 && limit == -1) snprintf (sql, 256, "SELECT repo_id FROM Repo"); else snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repos, &ret) < 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[256]; snprintf (sql, sizeof(sql), "SELECT name, repo_id, commit_id FROM Branch WHERE repo_id='%s'", repo_id); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, get_branches, &ret) < 0) { g_warning ("[branch mgr] DB error when get branch list.\n"); return NULL; } return ret; }
char * get_origin_repo_id (SeafRepoManager *mgr, const char *repo_id) { char sql[256]; char origin_repo_id[37]; memset (origin_repo_id, 0, 37); snprintf (sql, 256, "SELECT origin_repo FROM VirtualRepo " "WHERE repo_id = '%s'", repo_id); seaf_db_foreach_selected_row (seaf->db, sql, load_virtual_info, origin_repo_id); if (origin_repo_id[0] != 0) return g_strdup(origin_repo_id); else return NULL; }
GList * seaf_share_manager_list_shared_to (SeafShareManager *mgr, const char *owner, const char *repo_id) { char sql[512]; GList *ret = NULL; snprintf (sql, sizeof(sql), "SELECT to_email FROM SharedRepo WHERE " "from_email='%s' AND repo_id='%s'", owner, repo_id); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_shared_to, &ret) < 0) { g_warning ("[share mgr] DB error when list shared to.\n"); string_list_free (ret); return NULL; } return ret; }
GList * seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, gboolean *error) { char sql[256]; GList *id_list = NULL, *ptr; GList *ret = NULL; SeafRepo *repo; *error = FALSE; if (start == -1 && limit == -1) snprintf (sql, 256, "SELECT repo_id FROM Repo"); else snprintf (sql, 256, "SELECT repo_id FROM Repo LIMIT %d, %d", start, limit); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repo_id, &id_list) < 0) goto error; for (ptr = id_list; ptr; ptr = ptr->next) { char *repo_id = ptr->data; repo = seaf_repo_manager_get_repo_ex (mgr, repo_id); if (repo) ret = g_list_prepend (ret, repo); } string_list_free (id_list); return ret; error: *error = TRUE; string_list_free (id_list); for (ptr = ret; ptr; ptr = ptr->next) { repo = ptr->data; seaf_repo_unref (repo); } return NULL; }
static SeafBranch * real_get_branch (SeafBranchManager *mgr, const char *repo_id, const char *name) { char commit_id[41]; char sql[256]; commit_id[0] = 0; snprintf (sql, sizeof(sql), "SELECT commit_id FROM Branch WHERE name='%s' AND repo_id='%s'", name, repo_id); if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, get_branch, commit_id) < 0) { g_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); }
int seaf_repo_manager_get_repo_history_limit (SeafRepoManager *mgr, const char *repo_id) { SeafVirtRepo *vinfo; const char *r_repo_id = repo_id; char sql[256]; int per_repo_days = -1; vinfo = seaf_repo_manager_get_virtual_repo_info (mgr, repo_id); if (vinfo) r_repo_id = vinfo->origin_repo_id; snprintf (sql, sizeof(sql), "SELECT days FROM RepoHistoryLimit WHERE repo_id='%s'", r_repo_id); seaf_virtual_repo_info_free (vinfo); /* We don't use seaf_db_get_int() because we need to differ DB error * from not exist. * We can't just return global config value if DB error occured, * since the global value may be smaller than per repo one. * This can lead to data lose in GC. */ if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, get_limit, &per_repo_days) < 0) { seaf_warning ("DB error.\n"); return -1; } /* If per repo value is not set, return the global one. */ if (per_repo_days < 0) return mgr->seaf->keep_history_days; return per_repo_days; }
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[512]; if (start == -1 && limit == -1) { if (g_strcmp0 (type, "from_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "to_email, permission, commit_id FROM " "SharedRepo LEFT JOIN VirtualRepo ON " "SharedRepo.repo_id=VirtualRepo.repo_id, Branch " "WHERE from_email='%s' AND " "SharedRepo.repo_id = Branch.repo_id AND " "Branch.name = 'master'", email); } else if (g_strcmp0 (type, "to_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, NULL, " "from_email, permission, commit_id FROM " "SharedRepo, Branch " "WHERE to_email='%s' AND " "SharedRepo.repo_id = Branch.repo_id AND " "Branch.name = 'master'", email); } else { /* should never reach here */ g_warning ("[share mgr] Wrong column type"); return NULL; } } else { if (g_strcmp0 (type, "from_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, VirtualRepo.repo_id, " "to_email, permission, commit_id FROM " "SharedRepo LEFT JOIN VirtualRepo ON " "SharedRepo.repo_id=VirtualRepo.repo_id, Branch " "WHERE from_email='%s' " "AND SharedRepo.repo_id = Branch.repo_id " "AND Branch.name = 'master' " "ORDER BY SharedRepo.repo_id " "LIMIT %d OFFSET %d", email, limit, start); } else if (g_strcmp0 (type, "to_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, NULL, " "from_email, permission, commit_id FROM " "SharedRepo, Branch WHERE " "to_email='%s' " "AND SharedRepo.repo_id = Branch.repo_id " "AND Branch.name = 'master' " "ORDER BY SharedRepo.repo_id " "LIMIT %d OFFSET %d", email, limit, start); } else { /* should never reach here */ g_warning ("[share mgr] Wrong column type"); return NULL; } } if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repos, &ret) < 0) { g_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; } return g_list_reverse (ret); }
GList* seaf_share_manager_list_org_share_repos (SeafShareManager *mgr, int org_id, const char *email, const char *type, int start, int limit) { GList *ret = NULL, *p; char sql[512]; if (start == -1 && limit == -1) { if (g_strcmp0 (type, "from_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, to_email, permission FROM " "SharedRepo, OrgRepo " "WHERE from_email='%s' AND " "OrgRepo.org_id=%d AND " "SharedRepo.repo_id=OrgRepo.repo_id", email, org_id); } else if (g_strcmp0 (type, "to_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, from_email, permission FROM " "SharedRepo, OrgRepo " "WHERE to_email='%s' AND " "OrgRepo.org_id=%d AND " "SharedRepo.repo_id=OrgRepo.repo_id", email, org_id); } else { /* should never reach here */ g_warning ("[share mgr] Wrong column type"); return NULL; } } else { if (g_strcmp0 (type, "from_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, to_email, permission FROM " "SharedRepo, OrgRepo WHERE " "from_email='%s' AND " "OrgRepo.org_id=%d AND " "SharedRepo.repo_id=OrgRepo.repo_id " "ORDER BY SharedRepo.repo_id " "LIMIT %d OFFSET %d", email, org_id, limit, start); } else if (g_strcmp0 (type, "to_email") == 0) { snprintf (sql, sizeof(sql), "SELECT SharedRepo.repo_id, from_email, permission FROM " "SharedRepo, OrgRepo WHERE " "to_email='%s' AND " "OrgRepo.org_id=%d AND " "SharedRepo.repo_id=OrgRepo.repo_id " "ORDER BY SharedRepo.repo_id " "LIMIT %d OFFSET %d", email, org_id, limit, start); } else { /* should never reach here */ g_warning ("[share mgr] Wrong column type"); return NULL; } } if (seaf_db_foreach_selected_row (mgr->seaf->db, sql, collect_repos, &ret) < 0) { g_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; } fill_in_repo_info (ret); return g_list_reverse (ret); }