1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-09-01 15:36:37 +00:00

Get repo list add return virtual repos (#605)

Co-authored-by: 杨赫然 <heran.yang@seafile.com>
This commit is contained in:
feiniks
2023-03-20 10:11:57 +08:00
committed by GitHub
parent 6ca4f18d31
commit ad5ce70ffb
8 changed files with 48 additions and 40 deletions

View File

@@ -2532,101 +2532,108 @@ seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr)
}
GList *
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, const char *order_by)
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit, const char *order_by, int ret_virt_repo)
{
GList *ret = NULL;
char *sql_base = NULL;
char sql[512];
int rc;
GString *sql = g_string_new ("");
if (start == -1 && limit == -1) {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_MYSQL:
sql_base = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
g_string_append (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, f.file_count 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 "
"LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id "
"LEFT JOIN Repo r ON i.repo_id = r.repo_id "
"LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id "
"WHERE r.repo_id IS NOT NULL AND "
"v.repo_id IS NULL ";
"WHERE r.repo_id IS NOT NULL ");
if (!ret_virt_repo)
g_string_append_printf (sql, "AND v.repo_id IS NULL ");
if (g_strcmp0 (order_by, "size") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY s.size DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY s.size DESC, i.repo_id");
else if (g_strcmp0 (order_by, "file_count") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY f.file_count DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY f.file_count DESC, i.repo_id");
else
snprintf (sql, sizeof(sql), "%sORDER BY i.update_time DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY i.update_time DESC, i.repo_id");
break;
case SEAF_DB_TYPE_SQLITE:
sql_base= "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
g_string_append (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, f.file_count 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 "
"LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id "
"LEFT JOIN Repo r ON i.repo_id = r.repo_id "
"LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id "
"WHERE r.repo_id IS NOT NULL AND "
"v.repo_id IS NULL ";
"WHERE r.repo_id IS NOT NULL ");
if (!ret_virt_repo)
g_string_append_printf (sql, "AND v.repo_id IS NULL ");
if (g_strcmp0 (order_by, "size") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY s.size DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY s.size DESC, i.repo_id");
else if (g_strcmp0 (order_by, "file_count") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY f.file_count DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY f.file_count DESC, i.repo_id");
else
snprintf (sql, sizeof(sql), "%sORDER BY i.update_time DESC, i.repo_id", sql_base);
g_string_append_printf (sql, "ORDER BY i.update_time DESC, i.repo_id");
break;
default:
g_string_free (sql, TRUE);
return NULL;
}
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql,
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql->str,
collect_repos_fill_size_commit, &ret,
0);
} else {
switch (seaf_db_type(mgr->seaf->db)) {
case SEAF_DB_TYPE_MYSQL:
sql_base = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
g_string_append (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, f.file_count 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 "
"LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id "
"LEFT JOIN Repo r ON i.repo_id = r.repo_id "
"LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id "
"WHERE r.repo_id IS NOT NULL AND "
"v.repo_id IS NULL ";
"WHERE r.repo_id IS NOT NULL ");
if (!ret_virt_repo)
g_string_append_printf (sql, "AND v.repo_id IS NULL ");
if (g_strcmp0 (order_by, "size") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY s.size DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY s.size DESC, i.repo_id LIMIT ? OFFSET ?");
else if (g_strcmp0 (order_by, "file_count") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY f.file_count DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY f.file_count DESC, i.repo_id LIMIT ? OFFSET ?");
else
snprintf (sql, sizeof(sql), "%sORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?");
break;
case SEAF_DB_TYPE_SQLITE:
sql_base = "SELECT i.repo_id, s.size, b.commit_id, i.name, i.update_time, "
g_string_append (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, f.file_count 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 "
"LEFT JOIN RepoFileCount f ON i.repo_id = f.repo_id "
"LEFT JOIN Repo r ON i.repo_id = r.repo_id "
"LEFT JOIN VirtualRepo v ON i.repo_id = v.repo_id "
"WHERE r.repo_id IS NOT NULL AND "
"v.repo_id IS NULL ";
"WHERE r.repo_id IS NOT NULL ");
if (!ret_virt_repo)
g_string_append_printf (sql, "AND v.repo_id IS NULL ");
if (g_strcmp0 (order_by, "size") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY s.size DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY s.size DESC, i.repo_id LIMIT ? OFFSET ?");
else if (g_strcmp0 (order_by, "file_count") == 0)
snprintf (sql, sizeof(sql), "%sORDER BY f.file_count DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY f.file_count DESC, i.repo_id LIMIT ? OFFSET ?");
else
snprintf (sql, sizeof(sql), "%sORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?", sql_base);
g_string_append_printf (sql, "ORDER BY i.update_time DESC, i.repo_id LIMIT ? OFFSET ?");
break;
default:
g_string_free (sql, TRUE);
return NULL;
}
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql,
rc = seaf_db_statement_foreach_row (mgr->seaf->db, sql->str,
collect_repos_fill_size_commit, &ret,
2, "int", limit, "int", start);
}
g_string_free (sql, TRUE);
if (rc < 0)
return NULL;

View File

@@ -147,7 +147,7 @@ seaf_repo_manager_repo_exists (SeafRepoManager *manager, const gchar *id);
GList*
seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit,
const gchar *order_by);
const gchar *order_by, int ret_virt_repo);
gint64
seaf_repo_manager_count_repos (SeafRepoManager *mgr, GError **error);

View File

@@ -91,7 +91,7 @@ static void start_rpc_service (const char *seafile_dir,
searpc_server_register_function ("seafserv-threaded-rpcserver",
seafile_get_repo_list,
"seafile_get_repo_list",
searpc_signature_objlist__int_int_string());
searpc_signature_objlist__int_int_string_int());
searpc_server_register_function ("seafserv-threaded-rpcserver",
seafile_count_repos,
"seafile_count_repos",