- size_t slen;
- const char *str;
- struct it_key key_in;
- while(zebra_rec_keys_read(reckeys, &str, &slen, &key_in))
- {
- int ch = 0;
- int i, j = 0;
- struct it_key key_out;
-
- assert(key_in.len >= 2);
- assert(key_in.len <= IT_KEY_LEVEL_MAX);
-
- /* check for buffer overflow */
- 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;
-
- /* key_in.mem[0] ord/ch */
- /* key_in.mem[1] filter specified record ID */
-
- /* encode the ordinal value (field/use/attribute) .. */
- ch = CAST_ZINT_TO_INT(key_in.mem[0]);
- zh->reg->key_buf_used +=
- key_SU_encode(ch, (char*)zh->reg->key_buf +
- zh->reg->key_buf_used);
-
- /* copy the 0-terminated stuff from str to output */
- memcpy((char*)zh->reg->key_buf + zh->reg->key_buf_used, str, slen);
- zh->reg->key_buf_used += slen;
- ((char*)zh->reg->key_buf)[(zh->reg->key_buf_used)++] = '\0';
-
- /* the delete/insert indicator */
- ((char*)zh->reg->key_buf)[(zh->reg->key_buf_used)++] = cmd;
-
- if (zh->m_staticrank) /* rank config enabled ? */
- {
- if (staticrank < 0)
- {
- yaz_log(YLOG_WARN, "staticrank = %ld. Setting to 0",
- (long) staticrank);
- staticrank = 0;
- }
- key_out.mem[j++] = staticrank;
- }
-
- if (key_in.mem[1]) /* filter specified record ID */
- key_out.mem[j++] = key_in.mem[1];
- else
- key_out.mem[j++] = sysno;
- for (i = 2; i < key_in.len; i++)
- key_out.mem[j++] = key_in.mem[i];
- key_out.len = j;
-
- memcpy((char*)zh->reg->key_buf + zh->reg->key_buf_used,
- &key_out, sizeof(key_out));
- (zh->reg->key_buf_used) += sizeof(key_out);
- }