* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Id: extract.c,v 1.116 2002-04-13 18:16:43 adam Exp $
+ * $Id: extract.c,v 1.119 2002-05-07 11:05:19 adam Exp $
*/
#include <stdio.h>
#include <assert.h>
#define PRINTF_OFF_T "%ld"
#endif
-static int records_inserted = 0;
-static int records_updated = 0;
-static int records_deleted = 0;
-static int records_processed = 0;
+static void shellsort(void *ar, int r, size_t s,
+ int (*cmp)(const void *a, const void *b))
+{
+ char *a = ar;
+ char v[100];
+ int h, i, j, k;
+ static const int incs[16] = { 1391376, 463792, 198768, 86961, 33936,
+ 13776, 4592, 1968, 861, 336,
+ 112, 48, 21, 7, 3, 1 };
+ for ( k = 0; k < 16; k++)
+ for (h = incs[k], i = h; i < r; i++)
+ {
+ memcpy (v, a+s*i, s);
+ j = i;
+ while (j > h && (*cmp)(a + s*(j-h), v) > 0)
+ {
+ memcpy (a + s*j, a + s*(j-h), s);
+ j -= h;
+ }
+ memcpy (a+s*j, v, s);
+ }
+}
+
-static void logRecord (int showFlag)
+static void logRecord (ZebraHandle zh)
{
- if (!showFlag)
- ++records_processed;
- if (showFlag || !(records_processed % 1000))
+ ++zh->records_processed;
+ if (!(zh->records_processed % 1000))
{
logf (LOG_LOG, "Records: %7d i/u/d %d/%d/%d",
- records_processed, records_inserted, records_updated,
- records_deleted);
+ zh->records_processed, zh->records_inserted, zh->records_updated,
+ zh->records_deleted);
}
}
{
/* error occured during extraction ... */
if (rGroup->flagRw &&
- records_processed < rGroup->fileVerboseLimit)
+ zh->records_processed < rGroup->fileVerboseLimit)
{
logf (LOG_WARN, "fail %s %s " PRINTF_OFF_T, rGroup->recordType,
fname, recordOffset);
logf (LOG_WARN, "cannot delete record above (seems new)");
return 1;
}
- if (records_processed < rGroup->fileVerboseLimit)
+ if (zh->records_processed < rGroup->fileVerboseLimit)
logf (LOG_LOG, "add %s %s " PRINTF_OFF_T, rGroup->recordType,
fname, recordOffset);
rec = rec_new (zh->reg->records);
extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
- records_inserted++;
+ zh->records_inserted++;
}
else
{
if (recordAttr->runNumber ==
zebraExplain_runNumberIncrement (zh->reg->zei, 0))
{
- logf (LOG_LOG, "skipped %s %s " PRINTF_OFF_T, rGroup->recordType,
- fname, recordOffset);
+ yaz_log (LOG_LOG, "run number = %d", recordAttr->runNumber);
+ yaz_log (LOG_LOG, "skipped %s %s " PRINTF_OFF_T,
+ rGroup->recordType, fname, recordOffset);
extract_flushSortKeys (zh, *sysno, -1, &zh->reg->sortKeys);
rec_rm (&rec);
- logRecord (0);
+ logRecord (zh);
return 1;
}
delkeys.buf_used = rec->size[recInfo_delKeys];
}
else
{
- if (records_processed < rGroup->fileVerboseLimit)
+ if (zh->records_processed < rGroup->fileVerboseLimit)
logf (LOG_LOG, "delete %s %s " PRINTF_OFF_T,
rGroup->recordType, fname, recordOffset);
- records_deleted++;
+ zh->records_deleted++;
if (matchStr)
dict_delete (zh->reg->matchDict, matchStr);
rec_del (zh->reg->records, &rec);
}
rec_rm (&rec);
- logRecord (0);
+ logRecord (zh);
return 1;
}
else
}
else
{
- if (records_processed < rGroup->fileVerboseLimit)
+ if (zh->records_processed < rGroup->fileVerboseLimit)
logf (LOG_LOG, "update %s %s " PRINTF_OFF_T,
rGroup->recordType, fname, recordOffset);
extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
- records_updated++;
+ zh->records_updated++;
}
}
}
/* commit this record */
rec_put (zh->reg->records, &rec);
- logRecord (0);
+ logRecord (zh);
return 1;
}
}
if (!rGroup->recordType)
{
- if (records_processed < rGroup->fileVerboseLimit)
+ if (zh->records_processed < rGroup->fileVerboseLimit)
logf (LOG_LOG, "? %s", fname);
return 0;
}
yaz_log (LOG_WARN, "extract error");
#else
if (rGroup->flagRw &&
- records_processed < rGroup->fileVerboseLimit)
+ zh->records_processed < rGroup->fileVerboseLimit)
{
logf (LOG_WARN, "fail %s %s %ld", rGroup->recordType,
fname, (long) recordOffset);
(zh->reg->key_file_no)++;
logf (LOG_LOG, "sorting section %d", (zh->reg->key_file_no));
#if !SORT_EXTRA
- qsort (zh->reg->key_buf + zh->reg->ptr_top - ptr_i, ptr_i, sizeof(char*),
- key_qsort_compare);
+ qsort (zh->reg->key_buf + zh->reg->ptr_top - ptr_i, ptr_i,
+ sizeof(char*), key_qsort_compare);
extract_get_fname_tmp (zh, out_fname, zh->reg->key_file_no);
if (!(outf = fopen (out_fname, "wb")))