int add_member_to_list(struct query *q, char *argv[], client *cl);
int delete_member_from_list(struct query *q, char *argv[], client *cl);
int register_user(struct query *q, char *argv[], client *cl);
+int do_user_reservation(struct query *q, char *argv[], client *cl);
int get_ace_use(struct query *q, char **argv, client *cl,
int (*action)(int, char *[], void *), void *actarg);
int (*action)(int, char *[], void *), void *actarg);
int get_lists_of_member(struct query *q, char **argv, client *cl,
int (*action)(int, char *[], void *), void *actarg);
+int get_user_reservations(struct query *q, char **argv, client *cl,
+ int (*action)(int, char *[], void *), void *actarg);
+int get_user_by_reservation(struct query *q, char **argv, client *cl,
+ int (*action)(int, char *[], void *),
+ void *actarg);
/* prototypes from qvalidate.pc */
-/* from qvalidate.dc */
int validate_fields(struct query *q, char *argv[], struct valobj *vo, int n);
int validate_row(struct query *q, char *argv[], struct validate *v);
return MR_SUCCESS;
}
+
+int do_user_reservation(struct query *q, char *argv[], client *cl)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ char resv[USERS_RESERVATIONS_SIZE];
+ char *trans, name[ALIAS_NAME_SIZE];
+ int uid;
+ EXEC SQL END DECLARE SECTION;
+
+ uid = *(int *)argv[0];
+ trans = argv[1];
+
+ EXEC SQL SELECT UPPER(name) INTO :name FROM alias
+ WHERE type = 'RESERVE' AND LOWER(trans) = LOWER(:trans);
+ if (dbms_errno)
+ return mr_errcode;
+ if (sqlca.sqlerrd[2] != 1)
+ return MR_STRING;
+ name[1] = '\0';
+
+ EXEC SQL SELECT reservations INTO :resv FROM users
+ WHERE users_id = :uid;
+ if (dbms_errno)
+ return mr_errcode;
+ strtrim(resv);
+
+ if (!strcmp(q->shortname, "aurv"))
+ {
+ if (strchr(resv, *name))
+ return MR_EXISTS;
+ if (strlen(resv) == USERS_RESERVATIONS_SIZE - 1)
+ return MR_ARG_TOO_LONG;
+
+ strcat(resv, name);
+ }
+ else
+ {
+ char *p = strchr(resv, *name);
+ if (!p)
+ return MR_NO_MATCH;
+ memmove(p, p + 1, strlen(p));
+ }
+
+ EXEC SQL UPDATE users SET reservations = NVL(:resv, CHR(0))
+ WHERE users_id = :uid;
+ if (dbms_errno)
+ return mr_errcode;
+
+ EXEC SQL UPDATE tblstats SET updates = updates + 1, modtime = SYSDATE
+ WHERE table_name = 'users';
+ return set_modtime_by_id(q, argv, cl);
+}
+
+int get_user_reservations(struct query *q, char **argv, client *cl,
+ int (*action)(int, char *[], void *), void *actarg)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ char resv[USERS_RESERVATIONS_SIZE], *p;
+ char trans[ALIAS_TRANS_SIZE], name[2] = { 0, 0 };
+ int uid;
+ EXEC SQL END DECLARE SECTION;
+ char *targv[1];
+
+ uid = *(int *)argv[0];
+
+ EXEC SQL SELECT reservations INTO :resv FROM users
+ WHERE users_id = :uid;
+ if (dbms_errno)
+ return mr_errcode;
+
+ targv[0] = trans;
+ p = resv;
+ while (*p && !isspace(*p))
+ {
+ name[0] = toupper(*p);
+ EXEC SQL SELECT trans INTO :trans FROM alias
+ WHERE type = 'RESERVE' AND UPPER(name) = :name;
+ if (dbms_errno)
+ return mr_errcode;
+ if (sqlca.sqlerrd[2] != 1)
+ sprintf(trans, "Unknown (%s)", name);
+ (*action)(1, targv, actarg);
+ p++;
+ }
+ return MR_SUCCESS;
+}
+
+int get_user_by_reservation(struct query *q, char **argv, client *cl,
+ int (*action)(int, char *[], void *), void *actarg)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ char resv[USERS_RESERVATIONS_SIZE], login[USERS_LOGIN_SIZE];
+ char *trans, name[ALIAS_NAME_SIZE];
+ int uid;
+ EXEC SQL END DECLARE SECTION;
+ char *targv[1];
+
+ trans = argv[0];
+
+ EXEC SQL SELECT UPPER(name) INTO :name FROM alias
+ WHERE type = 'RESERVE' AND LOWER(trans) = LOWER(:trans);
+ if (dbms_errno)
+ return mr_errcode;
+ if (sqlca.sqlerrd[2] != 1)
+ return MR_STRING;
+ name[1] = '\0';
+
+ EXEC SQL DECLARE csr_gubr CURSOR FOR
+ SELECT login FROM users WHERE reservations LIKE '%' || :name || '%';
+ EXEC SQL OPEN csr_gubr;
+ if (dbms_errno)
+ return mr_errcode;
+
+ targv[0] = login;
+ while (1)
+ {
+ EXEC SQL FETCH csr_gubr INTO :login;
+ if (sqlca.sqlcode)
+ break;
+ (*action)(1, targv, actarg);
+ }
+ EXEC SQL CLOSE csr_gubr;
+
+ return MR_SUCCESS;
+}
0,
};
+static char *aurv_fields[] = {
+ "login", "reservation",
+};
+
+static struct validate aurv_validate = {
+ VOuser0,
+ 1,
+ 0,
+ 0,
+ 0,
+ "users_id",
+ 0,
+ 0,
+ do_user_reservation,
+};
+
+static char *gurv_fields[] = {
+ "login",
+ "reservation",
+};
+
+static struct validate gurv_validate = {
+ VOuser0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ get_user_reservations,
+};
+
+static char *gubr_fields[] = {
+ "reservation",
+ "login",
+};
+
+static struct validate gubr_validate = {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ get_user_by_reservation,
+};
+
static char *gkum_fields[] = { "login", "kerberos",
"login", "kerberos" };
&dusr_validate,
},
+ {
+ /* Q_AURV - ADD_USER_RESERVATION */
+ "add_user_reservation",
+ "aurv",
+ 2,
+ UPDATE,
+ 0,
+ USERS_TABLE,
+ 0,
+ aurv_fields,
+ 2,
+ 0,
+ 0,
+ NULL,
+ &aurv_validate,
+ },
+
+ {
+ /* Q_GURV - GET_USER_RESERVATIONS */
+ "get_user_reservations",
+ "gurv",
+ 2,
+ RETRIEVE,
+ 0,
+ USERS_TABLE,
+ 0,
+ gurv_fields,
+ 2,
+ 0,
+ 1,
+ NULL,
+ &gurv_validate,
+ },
+
+ {
+ /* Q_GUBR - GET_USER_BY_RESERVATION */
+ "get_user_by_reservation",
+ "gubr",
+ 2,
+ RETRIEVE,
+ 0,
+ USERS_TABLE,
+ 0,
+ gubr_fields,
+ 1,
+ 0,
+ 1,
+ NULL,
+ &gubr_validate,
+ },
+
+ {
+ /* Q_DURV - DELETE_USER_RESERVATION */
+ "delete_user_reservation",
+ "durv",
+ 2,
+ UPDATE,
+ 0,
+ USERS_TABLE,
+ 0,
+ aurv_fields,
+ 2,
+ 0,
+ 0,
+ NULL,
+ &aurv_validate,
+ },
+
{
/* Q_GKUM - GET_KERBEROS_USER_MAP */
"get_kerberos_user_map",