* Sebastian Hammer, Adam Dickmeiss
*
* $Log: extract.c,v $
- * Revision 1.47 1996-01-17 14:57:48 adam
+ * Revision 1.49 1996-02-05 12:29:57 adam
+ * Logging reduced a bit.
+ * The remaining running time is estimated during register merge.
+ *
+ * Revision 1.48 1996/02/01 20:53:26 adam
+ * The temporary per-record keys are compacted a little, and duplication
+ * of the per-records keys are avoided when they are saved in the record
+ * information buffer.
+ *
+ * Revision 1.47 1996/01/17 14:57:48 adam
* Prototype changed for reader functions in extract/retrieve. File
* is identified by 'void *' instead of 'int.
*
int buf_used;
int buf_max;
char *buf;
+ char prevAttrSet;
+ short prevAttrUse;
} reckeys;
static void addRecordKey (const RecWord *p)
char attrSet;
short attrUse;
size_t i;
+ int lead = 0;
if (reckeys.buf_used+1024 > reckeys.buf_max)
{
char *b;
- b = xmalloc (reckeys.buf_max += 65000);
+ b = xmalloc (reckeys.buf_max += 128000);
if (reckeys.buf_used > 0)
memcpy (b, reckeys.buf, reckeys.buf_used);
xfree (reckeys.buf);
reckeys.buf = b;
}
dst = reckeys.buf + reckeys.buf_used;
+
+ attrSet = p->attrSet;
+ if (reckeys.buf_used > 0 && reckeys.prevAttrSet == attrSet)
+ lead |= 1;
+ else
+ reckeys.prevAttrSet = attrSet;
+ attrUse = p->attrUse;
+ if (reckeys.buf_used > 0 && reckeys.prevAttrUse == attrUse)
+ lead |= 2;
+ else
+ reckeys.prevAttrUse = attrUse;
+
switch (p->which)
{
case Word_String:
- attrSet = p->attrSet;
- memcpy (dst, &attrSet, sizeof(attrSet));
- dst += sizeof(attrSet);
+ *dst++ = lead;
- attrUse = p->attrUse;
- memcpy (dst, &attrUse, sizeof(attrUse));
- dst += sizeof(attrUse);
-
+ if (!(lead & 1))
+ {
+ memcpy (dst, &attrSet, sizeof(attrSet));
+ dst += sizeof(attrSet);
+ }
+ if (!(lead & 2))
+ {
+ memcpy (dst, &attrUse, sizeof(attrUse));
+ dst += sizeof(attrUse);
+ }
for (i = 0; p->u.string[i]; i++)
*dst++ = p->u.string[i];
*dst++ = '\0';
static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys,
const char *databaseName)
{
+ char attrSet = -1;
+ short attrUse = -1;
int off = 0;
while (off < reckeys->buf_used)
{
const char *src = reckeys->buf + off;
- char attrSet;
- short attrUse;
struct it_key key;
-
- memcpy (&attrSet, src, sizeof(attrSet));
- src += sizeof(attrSet);
-
- memcpy (&attrUse, src, sizeof(attrUse));
- src += sizeof(attrUse);
+ int lead;
+
+ lead = *src++;
+ if (!(lead & 1))
+ {
+ memcpy (&attrSet, src, sizeof(attrSet));
+ src += sizeof(attrSet);
+ }
+ if (!(lead & 2))
+ {
+ memcpy (&attrUse, src, sizeof(attrUse));
+ src += sizeof(attrUse);
+ }
if (key_buf_used + 1024 > (ptr_top-ptr_i)*sizeof(char*))
key_flush ();
++ptr_i;
}
if (first)
{
- logf (LOG_WARN, "Record in file %s didn't contain match"
- " fields in (%d,%d)", fname, attrSet, attrUse);
+ logf (LOG_WARN, "Record didn't contain match"
+ " fields in (%d,%d)", attrSet, attrUse);
return NULL;
}
}
return dstBuf;
}
+struct recordLogInfo {
+ const char *fname;
+ char *op;
+ struct recordGroup *rGroup;
+};
+
+static void recordLogPreamble (int level, const char *msg, void *info)
+{
+ struct recordLogInfo *p = info;
+ FILE *outf = log_file ();
+
+ if (level & LOG_LOG)
+ return ;
+ if (p->op)
+ fprintf (outf, "%s of ", p->op);
+ fprintf (outf, "%s type %s\n", p->rGroup->recordType, p->fname);
+ log_event_start (NULL, NULL);
+}
+
static int recordExtract (SYSNO *sysno, const char *fname,
struct recordGroup *rGroup, int deleteFlag,
struct file_read_info *fi, RecType recType,
char *matchStr;
SYSNO sysnotmp;
Record rec;
+ struct recordLogInfo logInfo;
+ logInfo.fname = fname;
+ logInfo.op = NULL;
+ logInfo.rGroup = rGroup;
+ log_event_start (recordLogPreamble, &logInfo);
+
if (fi->fd != -1)
{
extractCtrl.fh = fi;
extractCtrl.add = addRecordKeyAny;
reckeys.buf_used = 0;
+ reckeys.prevAttrUse = -1;
+ reckeys.prevAttrSet = -1;
extractCtrl.readf = file_read;
r = (*recType->extract)(&extractCtrl);
}
else
{
- logf (LOG_WARN, "Record not inserted");
+ logf (LOG_WARN, "Bad match criteria");
return 0;
}
}
{
if (deleteFlag)
{
- logf (LOG_LOG, "? %s", fname);
+ logf (LOG_LOG, "Cannot delete new record");
return 1;
}
- logf (LOG_LOG, "add %s %s", rGroup->recordType, fname);
+ logInfo.op = "add";
+#if 0
+ logf (LOG_LOG, "update %s %s", rGroup->recordType,
+ fname);
+#endif
rec = rec_new (records);
*sysno = rec->sysno;
flushRecordKeys (*sysno, 0, &delkeys, rec->info[recInfo_databaseName]);
if (deleteFlag)
{
+ logInfo.op = "delete";
if (!delkeys.buf_used)
{
- logf (LOG_WARN, "cannot delete %s: storeKeys false",
- fname);
+ logf (LOG_WARN, "cannot delete; storeKeys false");
}
else
{
+#if 0
logf (LOG_LOG, "delete %s %s", rGroup->recordType, fname);
+#endif
records_deleted++;
if (matchStr)
dict_delete (matchDict, matchStr);
}
else
{
+ logInfo.op = "update";
if (!delkeys.buf_used)
{
- logf (LOG_WARN, "cannot update %s: storeKeys false",
- fname);
+ logf (LOG_WARN, "cannot update; storeKeys false");
}
else
{
+#if 0
logf (LOG_LOG, "update %s %s", rGroup->recordType,
fname);
+#endif
flushRecordKeys (*sysno, 1, &reckeys, rGroup->databaseName);
records_updated++;
}
xfree (rec->info[recInfo_delKeys]);
if (reckeys.buf_used > 0 && rGroup->flagStoreKeys == 1)
{
+#if 1
+ rec->size[recInfo_delKeys] = reckeys.buf_used;
+ rec->info[recInfo_delKeys] = reckeys.buf;
+ reckeys.buf = NULL;
+ reckeys.buf_max = 0;
+#else
rec->info[recInfo_delKeys] = xmalloc (reckeys.buf_used);
rec->size[recInfo_delKeys] = reckeys.buf_used;
memcpy (rec->info[recInfo_delKeys], reckeys.buf,
rec->size[recInfo_delKeys]);
+#endif
}
else
{
rec_strdup (rGroup->databaseName, &rec->size[recInfo_databaseName]);
rec_put (records, &rec);
+ log_event_start (NULL, NULL);
return 1;
}
sprintf (ext_res, "%srecordType", gprefix);
if (!(rGroup->recordType = res_get (common_resource, ext_res)))
{
+#if 0
logf (LOG_LOG, "? %s", fname);
+#endif
return 0;
}
}
}
if (!rGroup->recordType)
{
+#if 0
logf (LOG_LOG, "? record %s", fname);
+#endif
return 0;
}
if (!(recType = recType_byName (rGroup->recordType, subType)))