diff --git a/common/rpc-service.c b/common/rpc-service.c index 74e8e2a..435e22f 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -1218,6 +1218,23 @@ seafile_list_owned_repos (const char *email, int ret_corrupted, return ret; } +GList * +seafile_search_repos_by_name (const char *name, GError **error) +{ + GList *ret = NULL; + GList *repos, *ptr; + + repos = seaf_repo_manager_search_repos_by_name (seaf->repo_mgr, name); + ret = convert_repo_list (repos); + + for (ptr = repos; ptr; ptr = ptr->next) { + seaf_repo_unref ((SeafRepo *)ptr->data); + } + g_list_free (repos); + + return g_list_reverse(ret); +} + gint64 seafile_get_user_quota_usage (const char *email, GError **error) { diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index 0d98d1f..ec16407 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -449,6 +449,9 @@ GList * seafile_list_owned_repos (const char *email, int ret_corrupted, int start, int limit, GError **error); +GList * +seafile_search_repos_by_name(const char *name, GError **error); + /** * seafile_add_chunk_server: * @server: ID for the chunk server. diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index 3ed7159..cc3c309 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -66,6 +66,11 @@ class SeafServerThreadedRpcClient(NamedPipeClient): pass list_owned_repos = seafile_list_owned_repos + @searpc_func("objlist", ["string"]) + def seafile_search_repos_by_name(name): + pass + search_repos_by_name = seafile_search_repos_by_name + @searpc_func("int64", ["string"]) def seafile_server_repo_size(repo_id): pass diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 20ee546..ca6123d 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -136,6 +136,9 @@ class SeafileAPI(object): 1 if ret_corrupted else 0, start, limit) + def search_repos_by_name(self, name): + return seafserv_threaded_rpc.search_repos_by_name(name) + def get_orphan_repo_list(self): return seafserv_threaded_rpc.get_orphan_repo_list() diff --git a/server/repo-mgr.c b/server/repo-mgr.c index a6a5c20..421d3c9 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -2350,6 +2350,58 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, return ret; } +GList * +seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name) +{ + GList *repo_list = NULL; + char *sql = NULL; + + char *db_patt = g_strdup_printf ("%%%s%%", name); + + switch (seaf_db_type(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.name COLLATE UTF8_GENERAL_CI LIKE ? 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.name ILIKE ? 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.name LIKE ? COLLATE NOCASE AND " + "i.repo_id NOT IN (SELECT v.repo_id FROM VirtualRepo v) " + "ORDER BY i.update_time DESC, i.repo_id"; + break; + default: + g_free (db_patt); + return NULL; + } + + if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, + collect_repos_fill_size_commit, &repo_list, + 1, "string", db_patt) < 0) { + g_free (db_patt); + return NULL; + } + + g_free (db_patt); + return repo_list; +} + GList * seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr) { diff --git a/server/repo-mgr.h b/server/repo-mgr.h index ccc06b0..6364439 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -603,6 +603,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, int ret_corrupted, int start, int limit); +GList * +seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name); GList * seaf_repo_manager_get_repo_ids_by_owner (SeafRepoManager *mgr, diff --git a/server/seaf-server.c b/server/seaf-server.c index 203353c..bbeaf63 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -114,6 +114,10 @@ static void start_rpc_service (const char *seafile_dir) seafile_list_owned_repos, "seafile_list_owned_repos", searpc_signature_objlist__string_int_int_int()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_search_repos_by_name, + "seafile_search_repos_by_name", + searpc_signature_objlist__string()); searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_server_repo_size, diff --git a/tests/test_repo_manipulation/test_repo_manipulation.py b/tests/test_repo_manipulation/test_repo_manipulation.py index 63a7822..9b350f7 100644 --- a/tests/test_repo_manipulation/test_repo_manipulation.py +++ b/tests/test_repo_manipulation/test_repo_manipulation.py @@ -91,6 +91,14 @@ def test_repo_manipulation(): t_commit_list = api.get_commit_list(t_repo_id, t_offset, t_limit) assert t_commit_list and len(t_commit_list) == 1 + #test search_repos_by_name + t_repo_list = api.search_repos_by_name (t_repo.name) + assert len (t_repo_list) == 1 and t_repo_list[0].id == t_repo_id + t_repo_list = api.search_repos_by_name (t_repo.name.upper()) + assert len (t_repo_list) == 1 and t_repo_list[0].id == t_repo_id + t_repo_list = api.search_repos_by_name (t_repo.name.lower()) + assert len (t_repo_list) == 1 and t_repo_list[0].id == t_repo_id + #test remove_repo api.remove_repo(t_repo_id) t_repo = api.get_repo(t_repo_id)