-/* $Id: extract.c,v 1.132 2002-11-26 22:18:34 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: extract.c,v 1.143 2003-03-13 04:25:17 pop Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003
Index Data Aps
This file is part of the Zebra server.
zh->reg->keys.prevAttrSet = -1;
zh->reg->keys.prevSeqNo = 0;
zh->reg->sortKeys.buf_used = 0;
- zh->reg->sortKeys.buf_max = 0;
- zh->reg->sortKeys.buf = 0;
recordOffset = fi->file_moffset;
extractCtrl.offset = fi->file_moffset;
&rGroup,
delete_flag,
test_mode,
+ recordType,
sysno,
match_criteria,
- "<no file>"));
+ "<no file>",
+ 0,1));
}
/*
If sysno is provided, then it's used to identify the reocord.
struct recordGroup *rGroup,
int delete_flag,
int test_mode,
+ const char *recordType,
int *sysno,
const char *match_criteria,
- const char *fname)
+ const char *fname,
+ int force_update,
+ int allow_update)
{
RecordAttr *recordAttr;
struct recExtractCtrl extractCtrl;
int i, r;
char *matchStr = 0;
- RecType recType;
+ RecType recType = NULL;
char subType[1024];
void *clientData;
- SYSNO sysnotmp;
Record rec;
long recordOffset = 0;
struct zebra_fetch_control fc;
extractCtrl.endf = zebra_record_int_end;
extractCtrl.fh = &fc;
+ zh->reg->keys.buf_used = 0;
+ zh->reg->keys.prevAttrUse = -1;
+ zh->reg->keys.prevAttrSet = -1;
+ zh->reg->keys.prevSeqNo = 0;
+ zh->reg->sortKeys.buf_used = 0;
+
/* announce database */
+
+ if (!(rGroup->databaseName)) {
+ logf (LOG_WARN, "Invalid record group, no database name given");
+ return 0;
+ }
+
if (zebraExplain_curDatabase (zh->reg->zei, rGroup->databaseName))
{
if (zebraExplain_newDatabase (zh->reg->zei, rGroup->databaseName, 0))
- return 0;
+ return 0;
}
-
- if (!(rGroup->recordType)) {
- logf (LOG_WARN, "No such record type defined");
- return 0;
+
+ if (*recordType) {
+ logf (LOG_DEBUG, "Record type explicitly specified: %s", recordType);
+ recType = recType_byName (zh->reg->recTypes, recordType, subType,
+ &clientData);
+ } else {
+ if (!(rGroup->recordType)) {
+ logf (LOG_WARN, "No such record type defined");
+ return 0;
+ }
+ logf (LOG_DEBUG, "Get record type from rgroup: %s",rGroup->recordType);
+ recType = recType_byName (zh->reg->recTypes, rGroup->recordType, subType,
+ &clientData);
+ recordType = rGroup->recordType;
}
-
- if (!(recType =
- recType_byName (zh->reg->recTypes, rGroup->recordType, subType,
- &clientData)))
- {
+
+ if (!recType) {
logf (LOG_WARN, "No such record type: %s", rGroup->recordType);
return 0;
}
- zh->reg->keys.buf_used = 0;
- zh->reg->keys.prevAttrUse = -1;
- zh->reg->keys.prevAttrSet = -1;
- zh->reg->keys.prevSeqNo = 0;
- zh->reg->sortKeys.buf_used = 0;
- zh->reg->sortKeys.buf_max = 0;
- zh->reg->sortKeys.buf = 0;
-
+
extractCtrl.subType = subType;
extractCtrl.init = extract_init;
extractCtrl.tokenAdd = extract_token_add;
/* match criteria */
matchStr = NULL;
- if (! *sysno) {
- char *rinfo;
- if (strlen(match_criteria) > 0) {
- matchStr = (char *)match_criteria;
- } else {
- if (rGroup->recordId && *rGroup->recordId) {
- matchStr = fileMatchStr (zh, &zh->reg->keys, rGroup, fname,
- rGroup->recordId);
- }
- }
- if (matchStr) {
- rinfo = dict_lookup (zh->reg->matchDict, matchStr);
- if (rinfo)
- memcpy (sysno, rinfo+1, sizeof(*sysno));
- } else {
- logf (LOG_WARN, "Bad match criteria (recordID)");
- return 0;
- }
-
+ if (! *sysno && match_criteria) {
+ char *rinfo;
+ if (*match_criteria) {
+ matchStr = (char *)match_criteria;
+ } else {
+ if (rGroup->recordId && *rGroup->recordId) {
+ matchStr = fileMatchStr (zh, &zh->reg->keys, rGroup, fname,
+ rGroup->recordId);
+ }
+ }
+ if (matchStr) {
+ rinfo = dict_lookup (zh->reg->matchDict, matchStr);
+ if (rinfo)
+ memcpy (sysno, rinfo+1, sizeof(*sysno));
+ } else {
+ logf (LOG_WARN, "Bad match criteria (recordID)");
+ return 0;
+ }
}
if (! *sysno)
/* new record */
if (delete_flag)
{
- logf (LOG_LOG, "delete %s %s %ld", rGroup->recordType,
+ logf (LOG_LOG, "delete %s %s %ld", recordType,
fname, (long) recordOffset);
logf (LOG_WARN, "cannot delete record above (seems new)");
return 1;
}
- logf (LOG_LOG, "add %s %s %ld", rGroup->recordType, fname,
+ logf (LOG_LOG, "add %s %s %ld", recordType, fname,
(long) recordOffset);
rec = rec_new (zh->reg->records);
extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
zh->records_inserted++;
- }
+ }
else
{
/* record already exists */
struct recKeys delkeys;
struct sortKeys sortKeys;
+ if (!allow_update) {
+ logf (LOG_LOG, "skipped %s %s %ld",
+ recordType, fname, (long) recordOffset);
+ logRecord(zh);
+ return -1;
+ }
+
rec = rec_get (zh->reg->records, *sysno);
assert (rec);
recordAttr = rec_init_attr (zh->reg->zei, rec);
- if (recordAttr->runNumber ==
- zebraExplain_runNumberIncrement (zh->reg->zei, 0))
- {
- logf (LOG_LOG, "skipped %s %s %ld", rGroup->recordType,
- fname, (long) recordOffset);
- extract_flushSortKeys (zh, *sysno, -1, &zh->reg->sortKeys);
- rec_rm (&rec);
- logRecord(zh);
- return 1;
+ if (!force_update) {
+ if (recordAttr->runNumber ==
+ zebraExplain_runNumberIncrement (zh->reg->zei, 0))
+ {
+ logf (LOG_LOG, "skipped %s %s %ld", recordType,
+ fname, (long) recordOffset);
+ extract_flushSortKeys (zh, *sysno, -1, &zh->reg->sortKeys);
+ rec_rm (&rec);
+ logRecord(zh);
+ return 1;
+ }
}
+
delkeys.buf_used = rec->size[recInfo_delKeys];
delkeys.buf = rec->info[recInfo_delKeys];
/* record going to be deleted */
if (!delkeys.buf_used)
{
- logf (LOG_LOG, "delete %s %s %ld", rGroup->recordType,
+ logf (LOG_LOG, "delete %s %s %ld", recordType,
fname, (long) recordOffset);
logf (LOG_WARN, "cannot delete file above, storeKeys false");
}
else
{
- logf (LOG_LOG, "delete %s %s %ld", rGroup->recordType,
+ logf (LOG_LOG, "delete %s %s %ld", recordType,
fname, (long) recordOffset);
zh->records_deleted++;
if (matchStr)
/* record going to be updated */
if (!delkeys.buf_used)
{
- logf (LOG_LOG, "update %s %s %ld", rGroup->recordType,
+ logf (LOG_LOG, "update %s %s %ld", recordType,
fname, (long) recordOffset);
logf (LOG_WARN, "cannot update file above, storeKeys false");
}
else
{
- logf (LOG_LOG, "update %s %s %ld", rGroup->recordType,
+ logf (LOG_LOG, "update %s %s %ld", recordType,
fname, (long) recordOffset);
extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
/* update file type */
xfree (rec->info[recInfo_fileType]);
rec->info[recInfo_fileType] =
- rec_strdup (rGroup->recordType, &rec->size[recInfo_fileType]);
+ rec_strdup (recordType, &rec->size[recInfo_fileType]);
/* update filename */
xfree (rec->info[recInfo_filename]);
{
ZebraHandle zh = p->extractCtrl->handle;
struct sortKeys *sk = &zh->reg->sortKeys;
- size_t off = 0;
+ int off = 0;
while (off < sk->buf_used)
{
void extract_token_add (RecWord *p)
{
WRBUF wrbuf;
+
+#if 0
+ yaz_log (LOG_LOG, "reg_type=%c attrSet=%d attrUse=%d seqno=%d s=%.*s",
+ p->reg_type, p->attrSet, p->attrUse, p->seqno, p->length,
+ p->string);
+#endif
if ((wrbuf = zebra_replace(p->zebra_maps, p->reg_type, 0,
p->string, p->length)))
{
int cmd, struct sortKeys *sk)
{
SortIdx sortIdx = zh->reg->sortIdx;
- size_t off = 0;
+ int off = 0;
sortIdx_sysno (sortIdx, sysno);
while (off < sk->buf_used)
{
- int set, use, slen, l;
+ int set, use, slen;
off += key_SU_decode(&set, sk->buf + off);
off += key_SU_decode(&use, sk->buf + off);