diff --git a/net/common/rpc-service.c b/net/common/rpc-service.c index af399a7..5c725b6 100644 --- a/net/common/rpc-service.c +++ b/net/common/rpc-service.c @@ -276,6 +276,10 @@ ccnet_start_rpc(CcnetSession *session) ccnet_rpc_set_group_creator, "set_group_creator", searpc_signature_int__int_string()); + searpc_server_register_function ("ccnet-threaded-rpcserver", + ccnet_rpc_search_groups, + "search_groups", + searpc_signature_objlist__string_int_int()); searpc_server_register_function ("ccnet-threaded-rpcserver", ccnet_rpc_create_org, @@ -776,6 +780,21 @@ ccnet_rpc_search_emailusers (const char *source, return emailusers; } +GList* +ccnet_rpc_search_groups (const char *group_patt, + int start, int limit, + GError **error) +{ + CcnetGroupManager *group_mgr = + ((CcnetServerSession *)session)->group_mgr; + GList *groups = NULL; + + groups = ccnet_group_manager_search_groups (group_mgr, + group_patt, + start, limit); + return groups; +} + GList* ccnet_rpc_search_ldapusers (const char *keyword, int start, int limit, diff --git a/net/common/rpc-service.h b/net/common/rpc-service.h index a2d10cc..88cf92e 100644 --- a/net/common/rpc-service.h +++ b/net/common/rpc-service.h @@ -114,6 +114,11 @@ ccnet_rpc_search_emailusers (const char *source, const char *email_patt, int start, int limit, GError **error); +GList* +ccnet_rpc_search_groups (const char *group_patt, + int start, int limit, + GError **error); + GList* ccnet_rpc_search_ldapusers (const char *keyword, diff --git a/net/server/group-mgr.c b/net/server/group-mgr.c index 5e1fbc3..42decae 100644 --- a/net/server/group-mgr.c +++ b/net/server/group-mgr.c @@ -783,3 +783,61 @@ ccnet_group_manager_set_group_creator (CcnetGroupManager *mgr, } +GList * +ccnet_group_manager_search_groups (CcnetGroupManager *mgr, + const char *keyword, + int start, int limit) +{ + CcnetDB *db = mgr->priv->db; + GList *ret = NULL; + int rc; + char *db_patt = g_strdup_printf ("%%%s%%", keyword); + + if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) { + if (start == -1 && limit == -1) + rc = ccnet_db_statement_foreach_row (db, + "SELECT group_id, group_name, " + "creator_name, timestamp " + "FROM \"Group\" WHERE group_name LIKE ?", + get_all_ccnetgroups_cb, &ret, + 1, "string", db_patt); + + else + rc = ccnet_db_statement_foreach_row (db, + "SELECT group_id, group_name, " + "creator_name, timestamp " + "FROM \"Group\" WHERE group_name LIKE ? " + "LIMIT ? OFFSET ?", + get_all_ccnetgroups_cb, &ret, + 3, "string", db_patt, + "int", limit, "int", start); + } else { + if (start == -1 && limit == -1) + rc = ccnet_db_statement_foreach_row (db, + "SELECT group_id, group_name, " + "creator_name, timestamp " + "FROM `Group` WHERE group_name LIKE ?", + get_all_ccnetgroups_cb, &ret, + 1, "string", db_patt); + else + rc = ccnet_db_statement_foreach_row (db, + "SELECT group_id, group_name, " + "creator_name, timestamp " + "FROM `Group` WHERE group_name LIKE ? " + "LIMIT ? OFFSET ?", + get_all_ccnetgroups_cb, &ret, + 3, "string", db_patt, + "int", limit, "int", start); + } + g_free (db_patt); + + if (rc < 0) { + while (ret != NULL) { + g_object_unref (ret->data); + ret = g_list_delete_link (ret, ret); + } + return NULL; + } + + return g_list_reverse (ret); +} diff --git a/net/server/group-mgr.h b/net/server/group-mgr.h index 5500b3e..6599322 100644 --- a/net/server/group-mgr.h +++ b/net/server/group-mgr.h @@ -107,5 +107,9 @@ ccnet_group_manager_set_group_creator (CcnetGroupManager *mgr, int group_id, const char *user_name); +GList* +ccnet_group_manager_search_groups (CcnetGroupManager *mgr, + const char *keyword, + int start, int limit); #endif /* GROUP_MGR_H */ diff --git a/python/ccnet/rpc.py b/python/ccnet/rpc.py index 2357053..e2d3a22 100644 --- a/python/ccnet/rpc.py +++ b/python/ccnet/rpc.py @@ -327,6 +327,10 @@ class CcnetThreadedRpcClient(RpcClientBase): def set_group_creator(self, group_id, user_name): pass + @searpc_func("objlist", ["string", "int", "int"]) + def search_groups(self, group_patt, start, limit): + pass + @searpc_func("int", ["string", "string", "string"]) def create_org(self, org_name, url_prefix, creator): pass