1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-09-24 20:48:01 +00:00

Merge pull request #296 from haiwen/fix_get_repo_list

seaf_repo_manager_get_repo_list should get all the repos in a loop
This commit is contained in:
Jiaqiang Xu
2019-12-09 14:55:16 +08:00
committed by GitHub

View File

@@ -2420,73 +2420,90 @@ seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr)
return ret;
}
typedef struct FileCount {
char *repo_id;
gint64 file_count;
} FileCount;
static void
free_file_count (gpointer data)
{
if (!data)
return;
FileCount *file_count = data;
g_free (file_count->repo_id);
g_free (file_count);
}
static gboolean
get_file_count_cb (SeafDBRow *row, void *data)
{
GList **file_counts = data;
const char *repo_id = seaf_db_row_get_column_text (row, 0);
gint64 fcount = seaf_db_row_get_column_int64 (row, 1);
FileCount *file_count = g_new0 (FileCount, 1);
file_count->repo_id = g_strdup (repo_id);
file_count->file_count = fcount;
*file_counts = g_list_prepend (*file_counts, file_count);
return TRUE;
}
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit)
{
GList *file_counts = NULL, *ptr;
GList *ret = NULL;
SeafRepo *repo;
FileCount *file_count;
char *sql = NULL;
int rc;
if (start == -1 && limit == -1)
rc = seaf_db_statement_foreach_row (mgr->seaf->db,
"SELECT r.repo_id, c.file_count FROM Repo r LEFT JOIN RepoFileCount c "
"ON r.repo_id = c.repo_id",
get_file_count_cb, &file_counts,
if (start == -1 && limit == -1) {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_MYSQL:
sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id";
break;
case SEAF_DB_TYPE_PGSQL:
sql = "SELECT i.repo_id, s.\"size\", b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id";
break;
case SEAF_DB_TYPE_SQLITE:
sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id";
break;
default:
return NULL;
}
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql,
collect_repos_fill_size_commit, &ret,
0);
else
rc = seaf_db_statement_foreach_row (mgr->seaf->db,
"SELECT r.repo_id, c.file_count FROM Repo r LEFT JOIN RepoFileCount c "
"ON r.repo_id = c.repo_id ORDER BY r.repo_id LIMIT ? OFFSET ?",
get_file_count_cb, &file_counts,
} else {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_MYSQL:
sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?";
break;
case SEAF_DB_TYPE_PGSQL:
sql = "SELECT i.repo_id, s.\"size\", b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?";
break;
case SEAF_DB_TYPE_SQLITE:
sql = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
"i.version, i.is_encrypted, i.last_modifier, i.status FROM "
"RepoInfo i LEFT JOIN RepoSize s ON i.repo_id = s.repo_id "
"LEFT JOIN Branch b ON i.repo_id = b.repo_id "
"WHERE i.repo_id IN (SELECT r.repo_id FROM Repo r) AND "
"i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) "
"ORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?";
break;
default:
return NULL;
}
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql,
collect_repos_fill_size_commit, &ret,
2, "int", limit, "int", start);
}
if (rc < 0)
return NULL;
for (ptr = file_counts; ptr; ptr = ptr->next) {
file_count = ptr->data;
repo = seaf_repo_manager_get_repo_ex (mgr, file_count->repo_id);
if (repo != NULL) {
repo->file_count = file_count->file_count;
ret = g_list_prepend (ret, repo);
}
}
g_list_free_full (file_counts, free_file_count);
return ret;
}