[1968] in Moira
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;
}