]> andersk Git - moira.git/commitdiff
add queries to deal with reservations (aurv, durv, gurv, gubr)
authordanw <danw>
Tue, 11 Jan 2000 19:50:02 +0000 (19:50 +0000)
committerdanw <danw>
Tue, 11 Jan 2000 19:50:02 +0000 (19:50 +0000)
server/mr_server.h
server/qsupport.pc
server/queries2.c

index a7b638b53e2056368bcfc1e2aaf3a358e4f64751..8d92e38b039e69a98857afecf3339e3c6539101b 100644 (file)
@@ -234,6 +234,7 @@ int set_pobox_pop(struct query *q, char *argv[], client *cl);
 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);
@@ -250,8 +251,12 @@ int count_members_of_list(struct query *q, char **argv, client *cl,
                          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);
index e8e7936edfeb4eb637d01a592647c45c750650ee..b33d6b10ab966b1d961a64f842e14a13dfbcbc04 100644 (file)
@@ -1478,3 +1478,128 @@ int set_pop_usage(id, cnt)
   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;
+}
index 5979f4067058a559c0172806f61eff31e8f80749..c600d6aa156bb9951dc9596e29f0dd23b8045b69 100644 (file)
@@ -363,6 +363,56 @@ static struct validate dusr_validate = {
   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" };
 
@@ -2819,6 +2869,74 @@ struct query Queries[] = {
     &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",
This page took 0.0585059999999999 seconds and 5 git commands to generate.