1
0
mirror of https://github.com/haiwen/ccnet-server.git synced 2025-09-03 05:44:19 +00:00

A few SQL optimizations.

- Avoid querying groups in a loop
- Avoid querying org groups in a loop
This commit is contained in:
Jonathan Xu
2017-04-06 17:40:01 +08:00
parent d18b7d5883
commit a97107618b
5 changed files with 155 additions and 139 deletions

View File

@@ -1092,29 +1092,11 @@ ccnet_rpc_quit_group (int group_id, const char *user_name, GError **error)
return ret; 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 * GList *
ccnet_rpc_get_groups (const char *username, GError **error) ccnet_rpc_get_groups (const char *username, GError **error)
{ {
CcnetGroupManager *group_mgr = CcnetGroupManager *group_mgr =
((CcnetServerSession *)session)->group_mgr; ((CcnetServerSession *)session)->group_mgr;
GList *group_ids = NULL;
GList *ret = NULL; GList *ret = NULL;
if (!username) { if (!username) {
@@ -1123,15 +1105,7 @@ ccnet_rpc_get_groups (const char *username, GError **error)
return NULL; return NULL;
} }
group_ids = ccnet_group_manager_get_groupids_by_user (group_mgr, username, ret = ccnet_group_manager_get_groups_by_user (group_mgr, username, error);
error);
if (group_ids == NULL) {
return NULL;
}
ret = convert_group_list (group_mgr, group_ids);
g_list_free (group_ids);
return ret; return ret;
} }
@@ -1274,7 +1248,7 @@ ccnet_rpc_remove_org (int org_id, GError **error)
} }
string_list_free (email_list); 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; ptr = group_ids;
while (ptr) { while (ptr) {
ccnet_group_manager_remove_group (group_mgr, (int)(long)ptr->data, error); 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) ccnet_rpc_get_org_groups (int org_id, int start, int limit, GError **error)
{ {
CcnetOrgManager *org_mgr = ((CcnetServerSession *)session)->org_mgr; CcnetOrgManager *org_mgr = ((CcnetServerSession *)session)->org_mgr;
CcnetGroupManager *group_mgr = ((CcnetServerSession *)session)->group_mgr;
GList *group_ids = NULL;
GList *ret = NULL; GList *ret = NULL;
if (org_id < 0) { if (org_id < 0) {
@@ -1488,13 +1460,7 @@ ccnet_rpc_get_org_groups (int org_id, int start, int limit, GError **error)
start = 0; start = 0;
} }
group_ids = ccnet_org_manager_get_org_groups (org_mgr, org_id, start, ret = ccnet_org_manager_get_org_groups (org_mgr, org_id, start, limit);
limit);
if (group_ids == NULL)
return NULL;
ret = convert_group_list (group_mgr, group_ids);
g_list_free (group_ids);
return ret; return ret;
} }

View File

@@ -232,87 +232,45 @@ out:
return group_id; 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, int ccnet_group_manager_create_group (CcnetGroupManager *mgr,
const char *group_name, const char *group_name,
const char *user_name, const char *user_name,
GError **error) 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); return create_group_common (mgr, group_name, user_name, error);
} }
static gboolean /* static gboolean */
duplicate_org_group_name (CcnetGroupManager *mgr, /* duplicate_org_group_name (CcnetGroupManager *mgr, */
int org_id, /* int org_id, */
const char *group_name) /* const char *group_name) */
{ /* { */
GList *org_groups = NULL, *ptr; /* GList *org_groups = NULL, *ptr; */
CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; /* CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; */
org_groups = ccnet_org_manager_get_org_groups (org_mgr, org_id, -1, -1); /* org_groups = ccnet_org_manager_get_org_groups (org_mgr, org_id, -1, -1); */
if (!org_groups) /* if (!org_groups) */
return FALSE; /* return FALSE; */
for (ptr = org_groups; ptr; ptr = ptr->next) { /* for (ptr = org_groups; ptr; ptr = ptr->next) { */
int group_id = (int)(long)ptr->data; /* int group_id = (int)(long)ptr->data; */
CcnetGroup *group = ccnet_group_manager_get_group (mgr, group_id, /* CcnetGroup *group = ccnet_group_manager_get_group (mgr, group_id, */
NULL); /* NULL); */
if (!group) /* if (!group) */
continue; /* continue; */
if (g_strcmp0 (group_name, ccnet_group_get_group_name(group)) == 0) { /* if (g_strcmp0 (group_name, ccnet_group_get_group_name(group)) == 0) { */
g_list_free (org_groups); /* g_list_free (org_groups); */
g_object_unref (group); /* g_object_unref (group); */
return TRUE; /* return TRUE; */
} else { /* } else { */
g_object_unref (group); /* g_object_unref (group); */
} /* } */
} /* } */
g_list_free (org_groups); /* g_list_free (org_groups); */
return FALSE; /* return FALSE; */
} /* } */
int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr, int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr,
int org_id, int org_id,
@@ -322,11 +280,11 @@ int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr,
{ {
CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr; CcnetOrgManager *org_mgr = ((CcnetServerSession *)(mgr->session))->org_mgr;
if (duplicate_org_group_name (mgr, org_id, group_name)) { /* if (duplicate_org_group_name (mgr, org_id, group_name)) { */
g_set_error (error, CCNET_DOMAIN, 0, /* g_set_error (error, CCNET_DOMAIN, 0, */
"The group has already created in this org."); /* "The group has already created in this org."); */
return -1; /* return -1; */
} /* } */
int group_id = create_group_common (mgr, group_name, user_name, error); int group_id = create_group_common (mgr, group_name, user_name, error);
if (group_id < 0) { if (group_id < 0) {
@@ -500,10 +458,16 @@ int ccnet_group_manager_set_group_name (CcnetGroupManager *mgr,
{ {
CcnetDB *db = mgr->priv->db; CcnetDB *db = mgr->priv->db;
ccnet_db_statement_query (db, if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL)
"UPDATE `Group` SET group_name = ? " ccnet_db_statement_query (db,
"WHERE group_id = ?", "UPDATE \"Group\" SET group_name = ? "
2, "string", group_name, "int", group_id); "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; return 0;
} }
@@ -537,35 +501,53 @@ int ccnet_group_manager_quit_group (CcnetGroupManager *mgr,
} }
static gboolean static gboolean
get_group_ids_cb (CcnetDBRow *row, void *data) get_user_groups_cb (CcnetDBRow *row, void *data)
{ {
GList **plist = data; GList **plist = data;
CcnetGroup *group;
int group_id = ccnet_db_row_get_column_int (row, 0); 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; return TRUE;
} }
GList * GList *
ccnet_group_manager_get_groupids_by_user (CcnetGroupManager *mgr, ccnet_group_manager_get_groups_by_user (CcnetGroupManager *mgr,
const char *user_name, const char *user_name,
GError **error) GError **error)
{ {
CcnetDB *db = mgr->priv->db; 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, if (ccnet_db_statement_foreach_row (db,
"SELECT group_id FROM GroupUser " sql,
"WHERE user_name=?", get_user_groups_cb, &groups,
get_group_ids_cb, &group_ids,
1, "string", user_name) < 0) { 1, "string", user_name) < 0) {
g_list_free (group_ids);
return NULL; return NULL;
} }
return g_list_reverse (group_ids); return g_list_reverse (groups);
} }
static gboolean static gboolean
@@ -604,9 +586,11 @@ ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id,
CcnetGroup *ccnetgroup = NULL; CcnetGroup *ccnetgroup = NULL;
if (ccnet_db_type(db) == CCNET_DB_TYPE_PGSQL) 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 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, if (ccnet_db_statement_foreach_row (db, sql,
get_ccnetgroup_cb, &ccnetgroup, get_ccnetgroup_cb, &ccnetgroup,
1, "int", group_id) < 0) 1, "int", group_id) < 0)
@@ -647,7 +631,7 @@ ccnet_group_manager_get_group_members (CcnetGroupManager *mgr, int group_id,
char *sql; char *sql;
GList *group_users = NULL; 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, if (ccnet_db_statement_foreach_row (db, sql,
get_ccnet_groupuser_cb, &group_users, get_ccnet_groupuser_cb, &group_users,
1, "int", group_id) < 0) 1, "int", group_id) < 0)

View File

@@ -72,9 +72,9 @@ int ccnet_group_manager_quit_group (CcnetGroupManager *mgr,
GError **error); GError **error);
GList * GList *
ccnet_group_manager_get_groupids_by_user (CcnetGroupManager *mgr, ccnet_group_manager_get_groups_by_user (CcnetGroupManager *mgr,
const char *user_name, const char *user_name,
GError **error); GError **error);
CcnetGroup * CcnetGroup *
ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id, ccnet_group_manager_get_group (CcnetGroupManager *mgr, int group_id,

View File

@@ -559,7 +559,7 @@ ccnet_org_manager_get_org_id_by_group (CcnetOrgManager *mgr,
} }
static gboolean static gboolean
get_org_groups (CcnetDBRow *row, void *data) get_org_group_ids (CcnetDBRow *row, void *data)
{ {
GList **plist = data; GList **plist = data;
@@ -571,10 +571,10 @@ get_org_groups (CcnetDBRow *row, void *data)
} }
GList * GList *
ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, ccnet_org_manager_get_org_group_ids (CcnetOrgManager *mgr,
int org_id, int org_id,
int start, int start,
int limit) int limit)
{ {
CcnetDB *db = mgr->priv->db; CcnetDB *db = mgr->priv->db;
GList *ret = NULL; GList *ret = NULL;
@@ -584,13 +584,13 @@ ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr,
rc = ccnet_db_statement_foreach_row (db, rc = ccnet_db_statement_foreach_row (db,
"SELECT group_id FROM OrgGroup WHERE " "SELECT group_id FROM OrgGroup WHERE "
"org_id = ?", "org_id = ?",
get_org_groups, &ret, get_org_group_ids, &ret,
1, "int", org_id); 1, "int", org_id);
} else { } else {
rc = ccnet_db_statement_foreach_row (db, rc = ccnet_db_statement_foreach_row (db,
"SELECT group_id FROM OrgGroup WHERE " "SELECT group_id FROM OrgGroup WHERE "
"org_id = ? LIMIT ? OFFSET ?", "org_id = ? LIMIT ? OFFSET ?",
get_org_groups, &ret, get_org_group_ids, &ret,
3, "int", org_id, "int", limit, 3, "int", org_id, "int", limit,
"int", start); "int", start);
} }
@@ -603,6 +603,66 @@ ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr,
return g_list_reverse (ret); 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 int
ccnet_org_manager_org_user_exists (CcnetOrgManager *mgr, ccnet_org_manager_org_user_exists (CcnetOrgManager *mgr,
int org_id, int org_id,

View File

@@ -97,6 +97,12 @@ ccnet_org_manager_get_org_id_by_group (CcnetOrgManager *mgr,
int group_id, int group_id,
GError **error); GError **error);
GList *
ccnet_org_manager_get_org_group_ids (CcnetOrgManager *mgr,
int org_id,
int start,
int limit);
GList * GList *
ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr, ccnet_org_manager_get_org_groups (CcnetOrgManager *mgr,
int org_id, int org_id,