int set_modtime(struct query *q, char *argv[], client *cl)
{
char *name, *entity, *table;
- int who;
+ int who, row = 0;
entity = cl->entity;
who = cl->client_id;
table = table_name[q->rtable];
- name = argv[0];
+
+ if (q->type == MR_Q_UPDATE)
+ row = 1;
+
+ name = argv[0 + row];
sprintf(stmt_buf, "UPDATE %s SET modtime = SYSDATE, modby = %d, "
"modwith = '%s' WHERE name = '%s'", table, who, entity, name);
char *ptype, *p;
int mid, sid, status, i;
EXEC SQL BEGIN DECLARE SECTION;
- int users_id, pid, iid, bid;
+ int users_id, pid, iid, bid, eid;
char mach[MACHINE_NAME_SIZE], fs[FILESYS_LABEL_SIZE];
char str[STRINGS_STRING_SIZE];
EXEC SQL END DECLARE SECTION;
ptype = argv[1];
users_id = atoi(argv[2]);
- EXEC SQL SELECT pop_id, imap_id, box_id INTO :pid, :iid, :bid
+ EXEC SQL SELECT pop_id, imap_id, box_id, exchange_id INTO :pid, :iid, :bid, :eid
FROM users WHERE users_id = :users_id;
if (sqlca.sqlcode)
return MR_USER;
/* If SMTP, don't bother fetching IMAP and POP boxes. */
if (ptype[1] == 'M')
- pid = iid = 0;
+ pid = iid = eid = 0;
}
if (iid)
{
if (sqlca.sqlcode)
return MR_MACHINE;
}
+ if (eid)
+ {
+ /* EXCHANGE, or SPLIT with EXCHANGE */
+ EXEC SQL SELECT m.name INTO :mach FROM machine m, users u
+ WHERE u.users_id = :users_id AND u.exchange_id = m.mach_id;
+ if (sqlca.sqlcode)
+ return MR_MACHINE;
+ }
free(argv[2]);
free(argv[3]);
/* Now assemble the right answer. */
- if (!strcmp(ptype, "POP"))
+ if (!strcmp(ptype, "POP") || !strcmp(ptype, "EXCHANGE"))
{
argv[2] = xstrdup(strtrim(mach));
argv[3] = xmalloc(strlen(argv[0]) + strlen(argv[2]) + 2);
client *cl)
{
char **argv;
- int status;
+ int status, idx;
+
+ if (q->version < 8)
+ idx = 0;
+ else
+ idx = 3;
while (sq_get_data(sq, &argv))
{
mr_trim_args(q->vcnt, argv);
- status = fix_ace(argv[7], &argv[8]);
+ status = fix_ace(argv[7 + idx], &argv[8 + idx]);
if (status && status != MR_NO_MATCH)
return status;
}
if (q->version < 6)
idx = 0;
- else
+ else if (q->version >= 6 && q->version < 8)
idx = 1;
+ else
+ idx = 2;
while (sq_get_data(sq, &argv))
{
if (q->version == 2)
status = fix_ace(argv[7], &argv[8]);
- else
+ else if (q->version > 2 && q->version < 10)
status = fix_ace(argv[8], &argv[9]);
+ else
+ status = fix_ace(argv[10], &argv[11]);
+
if (status && status != MR_NO_MATCH)
return status;
+
if (q->version > 3)
{
- status = fix_ace(argv[10], &argv[11]);
+ if (q->version < 10)
+ status = fix_ace(argv[10], &argv[11]);
+ else if (q->version >= 10)
+ status = fix_ace(argv[12], &argv[13]);
+
if (status && status != MR_NO_MATCH)
return status;
}
* conflicts between what is possible in the query table and what
* is possible in SQL.
*/
- if (q->type == APPEND)
+ if (q->type == MR_Q_APPEND)
{
incremental_clear_before();
EXEC SQL INSERT INTO quota
if (dbms_errno)
return mr_errcode;
- flush_name(argv[0], table);
- if (q->type == APPEND)
+ if (q->type == MR_Q_APPEND)
{
EXEC SQL UPDATE tblstats SET appends = appends + 1, modtime = SYSDATE
WHERE table_name = :tname;
if (dbms_errno)
return mr_errcode;
- flush_name(argv[0], table);
EXEC SQL UPDATE tblstats SET deletes = deletes + 1, modtime = SYSDATE
WHERE table_name = :tname;
return MR_SUCCESS;
}
}
+
+/* followup_gcon: fix the ace_name, memace_name, and modby */
+
+int followup_gcon(struct query *q, struct save_queue *sq, struct validate *v,
+ int (*action)(int, char *[], void *), void *actarg,
+ client *cl)
+{
+ char **argv;
+ int status, idx = 0;
+
+ if (q->version >= 9)
+ idx = 1;
+
+ while (sq_get_data(sq, &argv))
+ {
+ mr_trim_args(q->vcnt, argv);
+
+ status = fix_ace(argv[4 + idx], &argv[5 + idx]);
+ if (status && status != MR_NO_MATCH)
+ return status;
+
+ status = fix_ace(argv[6 + idx], &argv[7 + idx]);
+ if (status && status != MR_NO_MATCH)
+ return status;
+ }
+
+ return followup_fix_modby(q, sq, v, action, actarg, cl);
+}
+
+/* followup_get_user: fix the modby and creator.
+ * This assumes that the modby and creator fields are always
+ * in the same relative position in the argv.
+ */
+
+int followup_get_user(struct query *q, struct save_queue *sq, struct
+ validate *v, int (*action)(int, char *[], void *),
+ void *actarg, client *cl)
+{
+ char **argv;
+ int i, j, k, status, id;
+
+ i = q->vcnt - 4;
+ j = q->vcnt - 1;
+ while (sq_get_data(sq, &argv))
+ {
+ mr_trim_args(q->vcnt, argv);
+
+ id = atoi(argv[i]);
+ if (id > 0)
+ status = id_to_name(id, USERS_TABLE, &argv[i]);
+ else
+ status = id_to_name(-id, STRINGS_TABLE, &argv[i]);
+ if (status && status != MR_NO_MATCH)
+ return status;
+
+ id = atoi(argv[j]);
+ if (id > 0)
+ status = id_to_name(id, USERS_TABLE, &argv[j]);
+ else
+ status = id_to_name(-id, STRINGS_TABLE, &argv[j]);
+ if (status && status != MR_NO_MATCH)
+ return status;
+
+ if (q->version > 11)
+ {
+ status = fix_ace(argv[15], &argv[16]);
+ if (status && status != MR_NO_MATCH)
+ return status;
+ }
+
+ (*action)(q->vcnt, argv, actarg);
+ for (k = 0; k < q->vcnt; k++)
+ free(argv[k]);
+ free(argv);
+ }
+ sq_destroy(sq);
+ return MR_SUCCESS;
+}