diff --git a/net/common/rpc-service.c b/net/common/rpc-service.c index 5c725b6..cfa83a9 100644 --- a/net/common/rpc-service.c +++ b/net/common/rpc-service.c @@ -1092,29 +1092,11 @@ ccnet_rpc_quit_group (int group_id, const char *user_name, GError **error) return ret; } -static GList * -convert_group_list (CcnetGroupManager *mgr, GList *group_ids) -{ - GList *ret = NULL, *ptr; - - for (ptr = group_ids; ptr; ptr = ptr->next) { - int group_id = (int)(long)ptr->data; - CcnetGroup *group = ccnet_group_manager_get_group (mgr, group_id, - NULL); - if (group != NULL) { - ret = g_list_prepend (ret, group); - } - } - - return g_list_reverse (ret); -} - GList * ccnet_rpc_get_groups (const char *username, GError **error) { CcnetGroupManager *group_mgr = ((CcnetServerSession *)session)->group_mgr; - GList *group_ids = NULL; GList *ret = NULL; if (!username) { @@ -1123,15 +1105,7 @@ ccnet_rpc_get_groups (const char *username, GError **error) return NULL; } - group_ids = ccnet_group_manager_get_groupids_by_user (group_mgr, username, - error); - if (group_ids == NULL) { - return NULL; - } - - ret = convert_group_list (group_mgr, group_ids); - g_list_free (group_ids); - + ret = ccnet_group_manager_get_groups_by_user (group_mgr, username, error); return ret; } @@ -1274,7 +1248,7 @@ ccnet_rpc_remove_org (int org_id, GError **error) } string_list_free (email_list); - group_ids = ccnet_org_manager_get_org_groups (org_mgr, org_id, 0, INT_MAX); + group_ids = ccnet_org_manager_get_org_group_ids (org_mgr, org_id, 0, INT_MAX); ptr = group_ids; while (ptr) { ccnet_group_manager_remove_group (group_mgr, (int)(long)ptr->data, error); @@ -1474,8 +1448,6 @@ GList * ccnet_rpc_get_org_groups (int org_id, int start, int limit, GError **error) { CcnetOrgManager *org_mgr = ((CcnetServerSession *)session)->org_mgr; - CcnetGroupManager *group_mgr = ((CcnetServerSession *)session)->group_mgr; - GList *group_ids = NULL; GList *ret = NULL; if (org_id < 0) { @@ -1488,13 +1460,7 @@ ccnet_rpc_get_org_groups (int org_id, int start, int limit, GError **error) start = 0; } - group_ids = ccnet_org_manager_get_org_groups (org_mgr, org_id, start, - limit); - if (group_ids == NULL) - return NULL; - - ret = convert_group_list (group_mgr, group_ids); - g_list_free (group_ids); + ret = ccnet_org_manager_get_org_groups (org_mgr, org_id, start, limit); return ret; } diff --git a/net/server/group-mgr.c b/net/server/group-mgr.c index 42decae..4f7885e 100644 --- a/net/server/group-mgr.c +++ b/net/server/group-mgr.c @@ -232,87 +232,45 @@ out: return group_id; } -/* static gboolean */ -/* duplicate_group_name (CcnetGroupManager *mgr, */ -/* const char *group_name, */ -/* const char *user_name) */ -/* { */ -/* GList *groups = NULL, *ptr; */ -/* CcnetOrgManager *org_mgr = NULL; */ -/* gboolean ret = FALSE; */ - -/* groups = ccnet_group_manager_get_all_groups (mgr, -1, -1, NULL); */ -/* if (!groups) { */ -/* return FALSE; */ -/* } */ - -/* for (ptr = groups; ptr; ptr = ptr->next) { */ -/* CcnetGroup *group = (CcnetGroup *)ptr->data; */ -/* org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; */ -/* if (ccnet_org_manager_is_org_group(org_mgr, ccnet_group_get_id (group), */ -/* NULL)) { */ -/* /\* Skip org groups. *\/ */ -/* continue; */ -/* } */ - -/* if (g_strcmp0 (group_name, ccnet_group_get_group_name (group)) == 0) { */ -/* ret = TRUE; */ -/* goto out; */ -/* } */ -/* } */ - -/* out: */ -/* for (ptr = groups; ptr; ptr = ptr->next) */ -/* g_object_unref ((GObject *)ptr->data); */ -/* g_list_free (groups); */ -/* return ret; */ -/* } */ - int ccnet_group_manager_create_group (CcnetGroupManager *mgr, const char *group_name, const char *user_name, GError **error) { - - /* if (duplicate_group_name (mgr, group_name, user_name)) { */ - /* g_set_error (error, CCNET_DOMAIN, 0, "The group has already created"); */ - /* return -1; */ - /* } */ - return create_group_common (mgr, group_name, user_name, error); } -static gboolean -duplicate_org_group_name (CcnetGroupManager *mgr, - int org_id, - const char *group_name) -{ - GList *org_groups = NULL, *ptr; - CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; +/* static gboolean */ +/* duplicate_org_group_name (CcnetGroupManager *mgr, */ +/* int org_id, */ +/* const char *group_name) */ +/* { */ +/* GList *org_groups = NULL, *ptr; */ +/* CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; */ - org_groups = ccnet_org_manager_get_org_groups (org_mgr, org_id, -1, -1); - if (!org_groups) - return FALSE; +/* org_groups = ccnet_org_manager_get_org_groups (org_mgr, org_id, -1, -1); */ +/* if (!org_groups) */ +/* return FALSE; */ - for (ptr = org_groups; ptr; ptr = ptr->next) { - int group_id = (int)(long)ptr->data; - CcnetGroup *group = ccnet_group_manager_get_group (mgr, group_id, - NULL); - if (!group) - continue; +/* for (ptr = org_groups; ptr; ptr = ptr->next) { */ +/* int group_id = (int)(long)ptr->data; */ +/* CcnetGroup *group = ccnet_group_manager_get_group (mgr, group_id, */ +/* NULL); */ +/* if (!group) */ +/* continue; */ - if (g_strcmp0 (group_name, ccnet_group_get_group_name(group)) == 0) { - g_list_free (org_groups); - g_object_unref (group); - return TRUE; - } else { - g_object_unref (group); - } - } +/* if (g_strcmp0 (group_name, ccnet_group_get_group_name(group)) == 0) { */ +/* g_list_free (org_groups); */ +/* g_object_unref (group); */ +/* return TRUE; */ +/* } else { */ +/* g_object_unref (group); */ +/* } */ +/* } */ - g_list_free (org_groups); - return FALSE; -} +/* g_list_free (org_groups); */ +/* return FALSE; */ +/* } */ int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr, int org_id, @@ -322,11 +280,11 @@ int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr, { CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; - if (duplicate_org_group_name (mgr, org_id, group_name)) { - g_set_error (error, CCNET_DOMAIN, 0, - "The group has already created in this org."); - return -1; - } + /* if (duplicate_org_group_name (mgr, org_id, group_name)) { */ + /* g_set_error (error, CCNET_DOMAIN, 0, */ + /* "The group has already created in this org."); */ + /* return -1; */ + /* } */ int group_id = create_group_common (mgr, group_name, user_name, error); if (group_id < 0) { @@ -500,10 +458,16 @@ int ccnet_group_manager_set_group_name (CcnetGroupManager *mgr, { CcnetDB *db = mgr->priv->db; - ccnet_db_statement_query (db, - "UPDATE `Group` SET group_name = ? " - "WHERE group_id = ?", - 2, "string", group_name, "int", group_id); + if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) + ccnet_db_statement_query (db, + "UPDATE \"Group\" SET group_name = ? " + "WHERE group_id = ?", + 2, "string", group_name, "int", group_id); + else + ccnet_db_statement_query (db, + "UPDATE `Group` SET group_name = ? " + "WHERE group_id = ?", + 2, "string", group_name, "int", group_id); return 0; } @@ -537,35 +501,53 @@ int ccnet_group_manager_quit_group (CcnetGroupManager *mgr, } static gboolean -get_group_ids_cb (CcnetDBRow *row, void *data) +get_user_groups_cb (CcnetDBRow *row, void *data) { GList **plist = data; + CcnetGroup *group; int group_id = ccnet_db_row_get_column_int (row, 0); + const char *group_name = ccnet_db_row_get_column_text (row, 1); + const char *creator_name = ccnet_db_row_get_column_text (row, 2); + gint64 ts = ccnet_db_row_get_column_int64 (row, 3); - *plist = g_list_prepend (*plist, (gpointer)(long)group_id); + group = g_object_new (CCNET_TYPE_GROUP, + "id", group_id, + "group_name", group_name, + "creator_name", creator_name, + "timestamp", ts, + "source", "DB", + NULL); + + *plist = g_list_prepend (*plist, group); return TRUE; } GList * -ccnet_group_manager_get_groupids_by_user (CcnetGroupManager *mgr, - const char *user_name, - GError **error) +ccnet_group_manager_get_groups_by_user (CcnetGroupManager *mgr, + const char *user_name, + GError **error) { CcnetDB *db = mgr->priv->db; - GList *group_ids = NULL; + GList *groups = NULL; + char *sql; + + if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) + sql = "SELECT g.group_id, group_name, creator_name, timestamp FROM " + "\"Group\" g, GroupUser u WHERE g.group_id = u.group_id AND user_name=?"; + else + sql = "SELECT g.group_id, group_name, creator_name, timestamp FROM " + "`Group` g, GroupUser u WHERE g.group_id = u.group_id AND user_name=?"; if (ccnet_db_statement_foreach_row (db, - "SELECT group_id FROM GroupUser " - "WHERE user_name=?", - get_group_ids_cb, &group_ids, + sql, + get_user_groups_cb, &groups, 1, "string", user_name) < 0) { - g_list_free (group_ids); return NULL; } - return g_list_reverse (group_ids); + return g_list_reverse (groups); } static gboolean @@ -604,9 +586,11 @@ ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id, CcnetGroup *ccnetgroup = NULL; if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) - sql = "SELECT * FROM \"Group\" WHERE group_id = ?"; + sql = "SELECT group_id, group_name, creator_name, timestamp FROM " + "\"Group\" WHERE group_id = ?"; else - sql = "SELECT * FROM `Group` WHERE group_id = ?"; + sql = "SELECT group_id, group_name, creator_name, timestamp FROM " + "`Group` WHERE group_id = ?"; if (ccnet_db_statement_foreach_row (db, sql, get_ccnetgroup_cb, &ccnetgroup, 1, "int", group_id) < 0) @@ -647,7 +631,7 @@ ccnet_group_manager_get_group_members (CcnetGroupManager *mgr, int group_id, char *sql; GList *group_users = NULL; - sql = "SELECT * FROM GroupUser WHERE group_id = ?"; + sql = "SELECT group_id, user_name, is_staff FROM GroupUser WHERE group_id = ?"; if (ccnet_db_statement_foreach_row (db, sql, get_ccnet_groupuser_cb, &group_users, 1, "int", group_id) < 0) diff --git a/net/server/group-mgr.h b/net/server/group-mgr.h index 6599322..14bf51a 100644 --- a/net/server/group-mgr.h +++ b/net/server/group-mgr.h @@ -72,9 +72,9 @@ int ccnet_group_manager_quit_group (CcnetGroupManager *mgr, GError **error); GList * -ccnet_group_manager_get_groupids_by_user (CcnetGroupManager *mgr, - const char *user_name, - GError **error); +ccnet_group_manager_get_groups_by_user (CcnetGroupManager *mgr, + const char *user_name, + GError **error); CcnetGroup * ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id, diff --git a/net/server/org-mgr.c b/net/server/org-mgr.c index 3ef14aa..fee59d9 100644 --- a/net/server/org-mgr.c +++ b/net/server/org-mgr.c @@ -559,7 +559,7 @@ ccnet_org_manager_get_org_id_by_group (CcnetOrgManager *mgr, } static gboolean -get_org_groups (CcnetDBRow *row, void *data) +get_org_group_ids (CcnetDBRow *row, void *data) { GList **plist = data; @@ -571,10 +571,10 @@ get_org_groups (CcnetDBRow *row, void *data) } GList * -ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, - int org_id, - int start, - int limit) +ccnet_org_manager_get_org_group_ids (CcnetOrgManager *mgr, + int org_id, + int start, + int limit) { CcnetDB *db = mgr->priv->db; GList *ret = NULL; @@ -584,13 +584,13 @@ ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, rc = ccnet_db_statement_foreach_row (db, "SELECT group_id FROM OrgGroup WHERE " "org_id = ?", - get_org_groups, &ret, + get_org_group_ids, &ret, 1, "int", org_id); } else { rc = ccnet_db_statement_foreach_row (db, "SELECT group_id FROM OrgGroup WHERE " "org_id = ? LIMIT ? OFFSET ?", - get_org_groups, &ret, + get_org_group_ids, &ret, 3, "int", org_id, "int", limit, "int", start); } @@ -603,6 +603,66 @@ ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, return g_list_reverse (ret); } +static gboolean +get_org_groups (CcnetDBRow *row, void *data) +{ + GList **plist = data; + CcnetGroup *group; + + int group_id = ccnet_db_row_get_column_int (row, 0); + const char *group_name = ccnet_db_row_get_column_text (row, 1); + const char *creator_name = ccnet_db_row_get_column_text (row, 2); + gint64 ts = ccnet_db_row_get_column_int64 (row, 3); + + group = g_object_new (CCNET_TYPE_GROUP, + "id", group_id, + "group_name", group_name, + "creator_name", creator_name, + "timestamp", ts, + "source", "DB", + NULL); + + *plist = g_list_prepend (*plist, group); + + return TRUE; +} + +GList * +ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, + int org_id, + int start, + int limit) +{ + CcnetDB *db = mgr->priv->db; + char *sql; + GList *ret = NULL; + int rc; + + if (limit == -1) { + sql = "SELECT g.group_id, group_name, creator_name, timestamp FROM " + "OrgGroup o, `Group` g WHERE o.group_id = g.group_id AND org_id = ?"; + rc = ccnet_db_statement_foreach_row (db, + sql, + get_org_groups, &ret, + 1, "int", org_id); + } else { + sql = "SELECT g.group_id, group_name, creator_name, timestamp FROM " + "OrgGroup o, `Group` g WHERE o.group_id = g.group_id AND org_id = ? " + "LIMIT ? OFFSET ?"; + rc = ccnet_db_statement_foreach_row (db, + sql, + get_org_groups, &ret, + 3, "int", org_id, "int", limit, + "int", start); + } + + if (rc < 0) { + return NULL; + } + + return g_list_reverse (ret); +} + int ccnet_org_manager_org_user_exists (CcnetOrgManager *mgr, int org_id, diff --git a/net/server/org-mgr.h b/net/server/org-mgr.h index f60cefc..eafef4d 100644 --- a/net/server/org-mgr.h +++ b/net/server/org-mgr.h @@ -97,6 +97,12 @@ ccnet_org_manager_get_org_id_by_group (CcnetOrgManager *mgr, int group_id, GError **error); +GList * +ccnet_org_manager_get_org_group_ids (CcnetOrgManager *mgr, + int org_id, + int start, + int limit); + GList * ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, int org_id,