Logbook hierarchy can now be deeper than two levels

SVN revision: 1165
This commit is contained in:
Stefan Ritt 2005-01-05 20:36:49 +00:00
parent b02188d532
commit d5fcb4f765

View File

@ -6,6 +6,9 @@
Contents: Web server program for Electronic Logbook ELOG Contents: Web server program for Electronic Logbook ELOG
$Log$ $Log$
Revision 1.532 2005/01/05 20:36:49 midas
Logbook hierarchy can now be deeper than two levels
Revision 1.531 2005/01/05 15:56:10 midas Revision 1.531 2005/01/05 15:56:10 midas
Cancel button on 'create new logbook' now also works without password files Cancel button on 'create new logbook' now also works without password files
@ -1081,7 +1084,7 @@ char *getparam(char *param);
void write_logfile(LOGBOOK * lbs, const char *format, ...); void write_logfile(LOGBOOK * lbs, const char *format, ...);
BOOL check_login_user(LOGBOOK * lbs, char *user); BOOL check_login_user(LOGBOOK * lbs, char *user);
LBLIST get_logbook_hierarchy(void); LBLIST get_logbook_hierarchy(void);
int is_logbook_in_group(LBLIST pgrp, char *logbook); BOOL is_logbook_in_group(LBLIST pgrp, char *logbook);
BOOL is_admin_user(char *logbook, char *user); BOOL is_admin_user(char *logbook, char *user);
BOOL is_admin_user_global(char *user); BOOL is_admin_user_global(char *user);
void free_logbook_hierarchy(LBLIST root); void free_logbook_hierarchy(LBLIST root);
@ -6241,11 +6244,31 @@ void show_upgrade_page(LOGBOOK * lbs)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
LBLIST *get_subgroup(LBLIST pgrp, char *logbook)
/* retrieve parent of group member "logbook" (which might be group by itself) */
{
int i;
for (i = 0; i < pgrp->n_members; i++) {
/* check if logbook is current member */
if (strieq(logbook, pgrp->member[i]->name))
return &(pgrp->member[i]);
/* check if logbook is in subgroup of current member */
if (pgrp->member[i]->n_members > 0 && get_subgroup(pgrp->member[i], logbook))
return get_subgroup(pgrp->member[i], logbook);
}
return NULL;
}
/*------------------------------------------------------------------*/
LBLIST get_logbook_hierarchy(void) LBLIST get_logbook_hierarchy(void)
{ {
int i, j, k, n, m, flag; int i, j, n, m, flag;
char str[1000], grpname[256], grpmembers[1000]; char str[1000], grpname[256], grpmembers[1000];
LBLIST root; LBLIST root, *pgrp;
char grplist[MAX_N_LIST][NAME_LENGTH]; char grplist[MAX_N_LIST][NAME_LENGTH];
/* allocate root node */ /* allocate root node */
@ -6269,8 +6292,6 @@ LBLIST get_logbook_hierarchy(void)
if (flag) { if (flag) {
printf("Found group %s\n", grpname);
/* allocate new node, increase member pointer array by one */ /* allocate new node, increase member pointer array by one */
if (n == 0) if (n == 0)
root->member = xmalloc(sizeof(void *)); root->member = xmalloc(sizeof(void *));
@ -6306,27 +6327,21 @@ LBLIST get_logbook_hierarchy(void)
/* populate nodes with logbooks or other groups */ /* populate nodes with logbooks or other groups */
for (i = 0; i < root->n_members; i++) for (i = 0; i < root->n_members; i++)
if (root->member[i]) { if (root->member[i]) {
for (j = 0; j < root->member[i]->n_members; j++) {
/* check if node is valid logbook */
for (k = 0; lb_list[k].name[0]; k++)
if (strieq(root->member[i]->member[j]->name, lb_list[k].name))
break;
/* check if node is subgroup of other node */ for (j = 0; j < root->n_members; j++) {
if (!lb_list[k].name[0]) { if (i != j && root->member[j] != NULL &&
for (k = 0; k < root->n_members; k++) (pgrp = get_subgroup(root->member[j], root->member[i]->name)) != NULL) {
if (strieq(root->member[i]->member[j]->name, root->member[k]->name)) {
/* node is allocated twice, so free one... */ /* node is allocated twice, so free one...*/
xfree(root->member[i]->member[j]); xfree(*pgrp);
/* ... and reference the other */ /* ... and reference the other */
root->member[i]->member[j] = root->member[k]; *pgrp = root->member[i];
/* mark original pointer invalid */ /* mark original pointer invalid */
root->member[k] = NULL; root->member[i] = NULL;
break;
} break;
} }
} }
} }
@ -6385,23 +6400,23 @@ void free_logbook_hierarchy(LBLIST root)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
int is_logbook_in_group(LBLIST pgrp, char *logbook) BOOL is_logbook_in_group(LBLIST pgrp, char *logbook)
/* test if "logbook" is in group node plb */ /* test if "logbook" is in group node plb */
{ {
int i; int i;
if (strieq(pgrp->name, logbook)) if (strieq(logbook, pgrp->name))
return 1; return TRUE;
for (i = 0; i < pgrp->n_members; i++) { for (i = 0; i < pgrp->n_members; i++) {
if (strieq(logbook, pgrp->member[i]->name)) if (strieq(logbook, pgrp->member[i]->name))
return 1; return TRUE;
if (pgrp->member[i]->n_members > 0 && is_logbook_in_group(pgrp->member[i], logbook)) if (pgrp->member[i]->n_members > 0 && is_logbook_in_group(pgrp->member[i], logbook))
return 1; return TRUE;
} }
return 0; return FALSE;
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/