- struct recKeys delkeys;
- struct sortKeys sortkeys;
-
- delkeys.buf_used = rec->size[recInfo_delKeys];
- delkeys.buf = rec->info[recInfo_delKeys];
-
- sortkeys.buf_used = rec->size[recInfo_sortKeys];
- sortkeys.buf = rec->info[recInfo_sortKeys];
-
- extract_flushSortKeys (zh, rec->sysno, 0, &sortkeys);
- extract_flushRecordKeys (zh, rec->sysno, 0, &delkeys);
- }
- extract_flushRecordKeys (zh, rec->sysno, 1, &zh->reg->keys);
- extract_flushSortKeys (zh, rec->sysno, 1, &zh->reg->sortKeys);
-
- xfree (rec->info[recInfo_delKeys]);
- rec->size[recInfo_delKeys] = zh->reg->keys.buf_used;
- rec->info[recInfo_delKeys] = zh->reg->keys.buf;
- zh->reg->keys.buf = NULL;
- zh->reg->keys.buf_max = 0;
-
- xfree (rec->info[recInfo_sortKeys]);
- rec->size[recInfo_sortKeys] = zh->reg->sortKeys.buf_used;
- rec->info[recInfo_sortKeys] = zh->reg->sortKeys.buf;
- zh->reg->sortKeys.buf = NULL;
- zh->reg->sortKeys.buf_max = 0;
-
- return 0;
-}
-
-void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
- int cmd, struct recKeys *reckeys)
-{
-#if IT_KEY_NEW
- void *decode_handle = iscz1_start();
-#else
- int seqno = 0;
-#if SU_SCHEME
-#else
- unsigned char attrSet = (unsigned char) -1;
- unsigned short attrUse = (unsigned short) -1;
-#endif
-#endif
- int off = 0;
- int ch = 0;
- ZebraExplainInfo zei = zh->reg->zei;
-
- if (!zh->reg->key_buf)
- {
- int mem= 1024*1024* atoi( res_get_def( zh->res, "memmax", "8"));
- if (mem <= 0)
- {
- logf(LOG_WARN, "Invalid memory setting, using default 8 MB");
- mem= 1024*1024*8;
- }
- /* FIXME: That "8" should be in a default settings include */
- /* not hard-coded here! -H */
- zh->reg->key_buf = (char**) xmalloc (mem);
- zh->reg->ptr_top = mem/sizeof(char*);
- zh->reg->ptr_i = 0;
- zh->reg->key_buf_used = 0;
- zh->reg->key_file_no = 0;
- }
- zebraExplain_recordCountIncrement (zei, cmd ? 1 : -1);
-#if IT_KEY_NEW
- while (off < reckeys->buf_used)
- {
- const char *src = reckeys->buf + off;
- struct it_key key;
- char *dst = (char*) &key;
- int attrSet, attrUse;
-
- iscz1_decode(decode_handle, &dst, &src);
- assert(key.len < 4 && key.len > 2);
-
- attrSet = (int) key.mem[0];
- attrUse = (int) key.mem[1]; /* sequence in mem[2] */
-
- if (zh->reg->key_buf_used + 1024 >
- (zh->reg->ptr_top -zh->reg->ptr_i)*sizeof(char*))
- extract_flushWriteKeys (zh,0);
- ++(zh->reg->ptr_i);
- assert(zh->reg->ptr_i > 0);
- (zh->reg->key_buf)[zh->reg->ptr_top - zh->reg->ptr_i] =
- (char*)zh->reg->key_buf + zh->reg->key_buf_used;
-
- ch = zebraExplain_lookupSU (zei, attrSet, attrUse);
- if (ch < 0)
- ch = zebraExplain_addSU (zei, attrSet, attrUse);
-
- assert (ch > 0);
- zh->reg->key_buf_used +=
- key_SU_encode (ch,((char*)zh->reg->key_buf) +
- zh->reg->key_buf_used);
- while (*src)
- ((char*)zh->reg->key_buf) [(zh->reg->key_buf_used)++] = *src++;
- src++;
- ((char*)(zh->reg->key_buf))[(zh->reg->key_buf_used)++] = '\0';
- ((char*)(zh->reg->key_buf))[(zh->reg->key_buf_used)++] = cmd;
-
- key.len = 2;
- key.mem[0] = sysno;
- key.mem[1] = key.mem[2]; /* sequence .. */
-
- memcpy ((char*)zh->reg->key_buf + zh->reg->key_buf_used,
- &key, sizeof(key));
- (zh->reg->key_buf_used) += sizeof(key);
- off = src - reckeys->buf;
- }
-#else
- while (off < reckeys->buf_used)
- {
- const char *src = reckeys->buf + off;
- struct it_key key;
- int lead;
-
- lead = *src++;
-
-#if SU_SCHEME
- if ((lead & 3) < 3)
- {
- memcpy (&ch, src, sizeof(ch));
- src += sizeof(ch);
- }
-#else
- if (!(lead & 1))
- {
- memcpy (&attrSet, src, sizeof(attrSet));
- src += sizeof(attrSet);
- }
- if (!(lead & 2))
- {
- memcpy (&attrUse, src, sizeof(attrUse));
- src += sizeof(attrUse);
- }
-#endif
- if (zh->reg->key_buf_used + 1024 >
- (zh->reg->ptr_top -zh->reg->ptr_i)*sizeof(char*))
- extract_flushWriteKeys (zh,0);
- assert(zh->reg->ptr_i >= 0);
- ++(zh->reg->ptr_i);
- assert(zh->reg->ptr_i > 0);
- (zh->reg->key_buf)[zh->reg->ptr_top - zh->reg->ptr_i] =
- (char*)zh->reg->key_buf + zh->reg->key_buf_used;
-#if SU_SCHEME