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;
}
client *cl)
{
char **argv;
- int id, status;
+ int id, status, idx;
+
+ if (q->version < 6)
+ idx = 0;
+ else if (q->version >= 6 && q->version < 8)
+ idx = 1;
+ else
+ idx = 2;
while (sq_get_data(sq, &argv))
{
mr_trim_args(q->vcnt, argv);
- id = atoi(argv[13]);
- status = id_to_name(id, STRINGS_TABLE, &argv[13]);
+ id = atoi(argv[13 + idx]);
+ status = id_to_name(id, STRINGS_TABLE, &argv[13 + idx]);
if (status)
return status;
- id = atoi(argv[14]);
- status = id_to_name(id, STRINGS_TABLE, &argv[14]);
+ id = atoi(argv[14 + idx]);
+ status = id_to_name(id, STRINGS_TABLE, &argv[14 + idx]);
if (status)
return status;
- id = atoi(argv[16]);
+ id = atoi(argv[16 + idx]);
if (id < 0)
- status = id_to_name(-id, STRINGS_TABLE, &argv[16]);
+ status = id_to_name(-id, STRINGS_TABLE, &argv[16 + idx]);
else
- status = id_to_name(id, USERS_TABLE, &argv[16]);
+ status = id_to_name(id, USERS_TABLE, &argv[16 + idx]);
if (status && status != MR_NO_MATCH)
return status;
- status = fix_ace(argv[11], &argv[12]);
+ status = fix_ace(argv[11 + idx], &argv[12 + idx]);
if (status && status != MR_NO_MATCH)
return status;
}
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 && q->version < 10)
+ status = fix_ace(argv[10], &argv[11]);
+ else
+ status = fix_ace(argv[12], &argv[13]);
+
if (status && status != MR_NO_MATCH)
return status;
- if (q->version > 3)
- {
- status = fix_ace(argv[10], &argv[11]);
- if (status && status != MR_NO_MATCH)
- return status;
- }
if (atoi(argv[6]) == -1)
{
if (dbms_errno)
return mr_errcode;
- flush_name(argv[0], table);
if (q->type == APPEND)
{
EXEC SQL UPDATE tblstats SET appends = appends + 1, modtime = SYSDATE
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;
int (*action)(int, char *[], void *), void *actarg,
client *cl)
{
- int i, status;
+ int i, n, status;
char **argv;
+ if (q->version < 5)
+ n = 8;
+ else
+ n = 10;
+
while (sq_get_data(sq, &argv))
{
mr_trim_args(q->vcnt, argv);
- for (i = 1; i < 8; i += 2)
+ for (i = 1; i < n; i += 2)
{
status = fix_ace(argv[i], &argv[i + 1]);
if (status && status != MR_NO_MATCH)
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;
+
+ (*action)(q->vcnt, argv, actarg);
+ for (k = 0; k < q->vcnt; k++)
+ free(argv[k]);
+ free(argv);
+ }
+ sq_destroy(sq);
+ return MR_SUCCESS;
+}
+
+
+
+