[1968] in Moira

home help back first fref pref prev next nref lref last post

patch to make container name case insensitive

daemon@ATHENA.MIT.EDU (Qing Dong)
Wed Jul 31 15:42:22 2002

Message-Id: <5.1.0.14.2.20020731150953.04973c08@hesiod>
Date: Wed, 31 Jul 2002 15:42:20 -0400
To: moiradev@mit.edu
From: Qing Dong <dongq@MIT.EDU>
Cc: jcalz@mit.edu
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"; format=flowed

This is a patch to make container name case insensitive. It
also makes sure that the parent container exists before allowing
user to create a sub-container.

I submitted changes to some of the files before and they haven't
been checked in yet. This diff is base on what is currently in the
repository.

Thanks.


Index: mr_et.et
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/lib/mr_et.et,v
retrieving revision 1.28
diff -c -r1.28 mr_et.et
*** mr_et.et	2001/09/13 02:24:20	1.28
--- mr_et.et	2002/07/31 15:19:42
***************
*** 231,234 ****
--- 231,237 ----
   ec	MR_ACCOUNT_NUMBER,
   	"No such account number"

+ ec    MR_CONTAINER_NO_PARENT,
+ 	"Parent container does not exist"
+
   	end


Index: mr_server.h
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/server/mr_server.h,v
retrieving revision 1.58
diff -c -r1.58 mr_server.h
*** mr_server.h	2001/10/17 21:34:06	1.58
--- mr_server.h	2002/07/31 13:41:03
***************
*** 240,245 ****
--- 240,246 ----
   int setup_aprn(struct query *q, char *argv[], client *cl);
   int setup_dpsv(struct query *q, char *argv[], client *cl);
   int setup_dcon(struct query *q, char *argv[], client *cl);
+ int setup_acon(struct query *q, char *argv[], client *cl);

   /* prototypes from qsupport.pc */
   int set_pobox(struct query *q, char *argv[], client *cl);


Index: qrtn.pc
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/server/qrtn.pc,v
retrieving revision 2.25
diff -c -r2.25 qrtn.pc
*** qrtn.pc	2002/03/11 18:47:13	2.25
--- qrtn.pc	2002/07/31 14:55:09
***************
*** 1012,1018 ****
         EXEC SQL SELECT string_id INTO :j FROM strings WHERE string = :iname;
         break;
       case CONTAINERS_TABLE:
!       EXEC SQL SELECT cnt_id INTO :j FROM containers WHERE name = :iname;
         break;
       default:
         return MR_INTERNAL;
--- 1012,1018 ----
         EXEC SQL SELECT string_id INTO :j FROM strings WHERE string = :iname;
         break;
       case CONTAINERS_TABLE:
!       EXEC SQL SELECT cnt_id INTO :j FROM containers WHERE lower(name) = 
lower(:iname);
         break;
       default:
         return MR_INTERNAL;


Index: qsupport.pc
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/server/qsupport.pc,v
retrieving revision 2.41
diff -c -r2.41 qsupport.pc
*** qsupport.pc	2002/03/29 02:24:25	2.41
--- qsupport.pc	2002/07/31 15:17:11
***************
*** 2037,2043 ****
     if (!isrecursive)
       sprintf(tmp, "AND b.cnt_id = %d ", cnt_id);
     else
!     sprintf(tmp, "AND (b.cnt_id = %d OR b.name LIKE '%s/%%') ", cnt_id, 
containername);

     strcat(querystring, tmp);
     strcat(querystring, "ORDER BY b.name, a.name");
--- 2037,2043 ----
     if (!isrecursive)
       sprintf(tmp, "AND b.cnt_id = %d ", cnt_id);
     else
!     sprintf(tmp, "AND (b.cnt_id = %d OR lower(b.name) LIKE 
lower('%s/%%')) ", cnt_id, containername);

     strcat(querystring, tmp);
     strcat(querystring, "ORDER BY b.name, a.name");
***************
*** 2095,2104 ****
     strcpy(querystring, "SELECT name FROM containers ");

     if (!isrecursive)
!     sprintf(tmp, "WHERE name LIKE '%s/%%' and name NOT LIKE '%s/%%/%%' ", 
containername,
           containername);
     else
!     sprintf(tmp, "WHERE name LIKE '%s/%%' ", containername);

     strcat(querystring, tmp);
     strcat(querystring, "ORDER BY name");
--- 2095,2104 ----
     strcpy(querystring, "SELECT name FROM containers ");

     if (!isrecursive)
!     sprintf(tmp, "WHERE lower(name) LIKE lower('%s/%%') and lower(name) 
NOT LIKE lower('%s/%%/%%') ", containername,
           containername);
     else
!     sprintf(tmp, "WHERE lower(name) LIKE lower('%s/%%') ", containername);

     strcat(querystring, tmp);
     strcat(querystring, "ORDER BY name");

Index: queries2.c
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/server/queries2.c,v
retrieving revision 2.94
diff -c -r2.94 queries2.c
*** queries2.c	2002/04/30 02:18:15	2.94
--- queries2.c	2002/07/31 15:17:38
***************
*** 3386,3392 ****
     1,
     "cnt_id",
     0,
!   prefetch_value,
     set_modtime,
   };

--- 3386,3392 ----
     1,
     "cnt_id",
     0,
!   setup_acon,
     set_modtime,
   };

***************
*** 6987,6993 ****
       "name, description, location, contact, acl_type, acl_id, 
memacl_type, memacl_id, TO_CHAR(modtime, 'DD-mon-YYYY HH24:MI:SS'), modby, 
modwith FROM containers",
       gcon_fields,
       11,
!     "name LIKE '%s' AND cnt_id != 0",
       1,
       NULL,
       &gcon_validate,
--- 6987,6993 ----
       "name, description, location, contact, acl_type, acl_id, 
memacl_type, memacl_id, TO_CHAR(modtime, 'DD-mon-YYYY HH24:MI:SS'), modby, 
modwith FROM containers",
       gcon_fields,
       11,
!     "lower(name) LIKE lower('%s') AND cnt_id != 0",
       1,
       NULL,
       &gcon_validate,

Index: qsetup.pc
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/server/qsetup.pc,v
retrieving revision 2.49
diff -c -r2.49 qsetup.pc
*** qsetup.pc	2002/01/16 21:41:21	2.49
--- qsetup.pc	2002/07/31 15:30:52
***************
*** 1358,1364 ****
      strcpy(containername, strtrim(containername));

     EXEC SQL SELECT COUNT(cnt_id) INTO :cnt FROM containers
!     WHERE name LIKE :containername || '/' || '%';

     if (cnt > 0)
       return MR_IN_USE;
--- 1358,1364 ----
      strcpy(containername, strtrim(containername));

     EXEC SQL SELECT COUNT(cnt_id) INTO :cnt FROM containers
!     WHERE lower(name) LIKE lower(:containername || '/' || '%');

     if (cnt > 0)
       return MR_IN_USE;
***************
*** 1425,1428 ****
--- 1425,1455 ----
       }
     if (!isalnum(*(p - 1)))
       return 1;
+ }
+
+ int setup_acon(struct query *q, char *argv[], client *cl)
+ {
+ 	EXEC SQL BEGIN DECLARE SECTION;
+ 	char containername[CONTAINERS_NAME_SIZE];
+ 	EXEC SQL END DECLARE SECTION;
+
+ 	char* ptr;
+
+ 	memset(containername, 0, sizeof(containername));
+ 	strcpy(containername, argv[0]);
+ 	ptr = strrchr(containername, '/');
+ 	/* sub container, check for parents */
+ 	if (ptr)
+ 	{
+ 		ptr = '\0';
+ 		EXEC SQL SELECT * FROM containers
+ 			WHERE lower(name) = lower(:containername);	
+ 		if (sqlca.sqlerrd[2] != 1)
+ 			return MR_CONTAINER_NO_PARENT;
+ 	}
+
+ 	if ((mr_errcode = prefetch_value(q, argv, cl)) != MR_SUCCESS)
+ 		return mr_errcode;
+
+ 	return MR_SUCCESS;
   }


home help back first fref pref prev next nref lref last post