+#ifndef R_OK
+#define R_OK 4
+#endif
+
+void zebra_index_merge(ZebraHandle zh)
+{
+ struct key_file **kf = 0;
+ char rbuf[1024];
+ int i, r;
+ struct heap_info *hi;
+ struct progressInfo progressInfo;
+ int nkeys = key_block_get_no_files(zh->reg->key_block);
+
+ if (nkeys == 0)
+ return;
+
+ if (nkeys < 0)
+ {
+ char fname[1024];
+ nkeys = 0;
+ while (1)
+ {
+ extract_get_fname_tmp (zh, fname, nkeys+1);
+ if (access(fname, R_OK) == -1)
+ break;
+ nkeys++;
+ }
+ if (!nkeys)
+ return ;
+ }
+ kf = (struct key_file **) xmalloc((1+nkeys) * sizeof(*kf));
+ progressInfo.totalBytes = 0;
+ progressInfo.totalOffset = 0;
+ time(&progressInfo.startTime);
+ time(&progressInfo.lastTime);
+ for (i = 1; i<=nkeys; i++)
+ {
+ kf[i] = key_file_init(i, 8192, zh->res);
+ kf[i]->readHandler = progressFunc;
+ kf[i]->readInfo = &progressInfo;
+ progressInfo.totalBytes += kf[i]->length;
+ progressInfo.totalOffset += kf[i]->buf_size;
+ }
+ hi = key_heap_init_file(zh, nkeys, key_qsort_compare);
+ hi->reg = zh->reg;
+
+ for (i = 1; i<=nkeys; i++)
+ if ((r = key_file_read(kf[i], rbuf)))
+ key_heap_insert(hi, rbuf, r, kf[i]);
+
+ if (1)
+ {
+ struct heap_cread_info hci;
+
+ hci.key = (char *) xmalloc(KEY_SIZE);
+ hci.key_1 = (char *) xmalloc(KEY_SIZE);
+ hci.key_2 = (char *) xmalloc(KEY_SIZE);
+ hci.ret = -1;
+ hci.first_in_list = 1;
+ hci.hi = hi;
+ hci.look_level = 0;
+ hci.more = heap_read_one(hi, hci.cur_name, hci.key);
+
+ if (zh->reg->isams)
+ heap_inps(&hci, hi);
+ if (zh->reg->isamc)
+ heap_inpc(&hci, hi);
+ if (zh->reg->isamb)
+ heap_inpb(&hci, hi);
+
+ xfree(hci.key);
+ xfree(hci.key_1);
+ xfree(hci.key_2);
+ }
+
+ for (i = 1; i<=nkeys; i++)
+ {
+ extract_get_fname_tmp (zh, rbuf, i);
+ unlink(rbuf);
+ }
+ for (i = 1; i<=nkeys; i++)
+ key_file_destroy(kf[i]);
+ xfree(kf);
+ if (hi->no_iterations)
+ { /* do not log if nothing happened */
+ yaz_log(YLOG_LOG, "Iterations: isam/dict "
+ ZINT_FORMAT "/" ZINT_FORMAT,
+ hi->no_iterations, hi->no_diffs);
+ yaz_log(YLOG_LOG, "Dict: inserts/updates/deletions: "
+ ZINT_FORMAT "/" ZINT_FORMAT "/" ZINT_FORMAT,
+ hi->no_insertions, hi->no_updates, hi->no_deletions);
+ }
+ key_block_destroy(&zh->reg->key_block);
+ key_heap_destroy(hi, nkeys);
+}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */