- /* save file size of original record */
- zebraExplain_recordBytesIncrement (zh->service->zei,
- - recordAttr->recordSize);
-#if 0
- recordAttr->recordSize = fi->file_moffset - recordOffset;
- if (!recordAttr->recordSize)
- recordAttr->recordSize = fi->file_max - recordOffset;
-#else
- recordAttr->recordSize = buf_size;
-#endif
- zebraExplain_recordBytesIncrement (zh->service->zei,
- recordAttr->recordSize);
-
- /* set run-number for this record */
- recordAttr->runNumber =
- zebraExplain_runNumberIncrement (zh->service->zei, 0);
-
- /* update store data */
- xfree (rec->info[recInfo_storeData]);
- if (store_data == 1)
- {
- rec->size[recInfo_storeData] = recordAttr->recordSize;
- rec->info[recInfo_storeData] = (char *)
- xmalloc (recordAttr->recordSize);
-#if 1
- memcpy (rec->info[recInfo_storeData], buf, recordAttr->recordSize);
-#else
- if (lseek (fi->fd, recordOffset, SEEK_SET) < 0)
- {
- logf (LOG_ERRNO|LOG_FATAL, "seek to %ld in %s",
- (long) recordOffset, fname);
- exit (1);
- }
- if (read (fi->fd, rec->info[recInfo_storeData], recordAttr->recordSize)
- < recordAttr->recordSize)
- {
- logf (LOG_ERRNO|LOG_FATAL, "read %d bytes of %s",
- recordAttr->recordSize, fname);
- exit (1);
- }
-#endif
+void zebra_shadow_enable(ZebraHandle zh, int value)
+{
+ ASSERTZH;
+ yaz_log(log_level, "zebra_shadow_enable");
+ zh->shadow_enable = value;
+}
+
+ZEBRA_RES zebra_octet_term_encoding(ZebraHandle zh, const char *encoding)
+{
+ yaz_log(log_level, "zebra_octet_term_encoding %s", encoding);
+ ZEBRA_CHECK_HANDLE(zh);
+ assert(encoding);
+
+ if (zh->iconv_to_utf8 != 0)
+ yaz_iconv_close(zh->iconv_to_utf8);
+ if (zh->iconv_from_utf8 != 0)
+ yaz_iconv_close(zh->iconv_from_utf8);
+
+ zh->iconv_to_utf8 =
+ yaz_iconv_open("UTF-8", encoding);
+ if (zh->iconv_to_utf8 == 0)
+ yaz_log(YLOG_WARN, "iconv: %s to UTF-8 unsupported", encoding);
+ zh->iconv_from_utf8 =
+ yaz_iconv_open(encoding, "UTF-8");
+ if (zh->iconv_to_utf8 == 0)
+ yaz_log(YLOG_WARN, "iconv: UTF-8 to %s unsupported", encoding);
+
+ return ZEBRA_OK;
+}
+
+ZEBRA_RES zebra_record_encoding(ZebraHandle zh, const char *encoding)
+{
+ yaz_log(log_level, "zebra_record_encoding");
+ ZEBRA_CHECK_HANDLE(zh);
+ xfree(zh->record_encoding);
+ zh->record_encoding = 0;
+ if (encoding)
+ zh->record_encoding = xstrdup(encoding);
+ return ZEBRA_OK;
+}
+
+void zebra_set_resource(ZebraHandle zh, const char *name, const char *value)
+{
+ assert(name);
+ assert(value);
+ yaz_log(log_level, "zebra_set_resource %s:%s", name, value);
+ ASSERTZH;
+ res_set(zh->res, name, value);
+}
+
+const char *zebra_get_resource(ZebraHandle zh,
+ const char *name, const char *defaultvalue)
+{
+ const char *v;
+ ASSERTZH;
+ assert(name);
+ v = res_get_def(zh->res, name,(char *)defaultvalue);
+ yaz_log(log_level, "zebra_get_resource %s:%s", name, v);
+ return v;
+}
+
+/* moved from zebra_api_ext.c by pop */
+/* FIXME: Should this really be public??? -Heikki */
+
+int zebra_trans_no(ZebraHandle zh)
+{
+ yaz_log(log_level, "zebra_trans_no");
+ ASSERTZH;
+ return zh->trans_no;
+}
+
+int zebra_get_shadow_enable(ZebraHandle zh)
+{
+ yaz_log(log_level, "zebra_get_shadow_enable");
+ ASSERTZH;
+ return zh->shadow_enable;
+}
+
+void zebra_set_shadow_enable(ZebraHandle zh, int value)
+{
+ yaz_log(log_level, "zebra_set_shadow_enable %d",value);
+ ASSERTZH;
+ zh->shadow_enable = value;
+}
+
+ZEBRA_RES zebra_add_record(ZebraHandle zh,
+ const char *buf, int buf_size)
+{
+ return zebra_update_record(zh, action_update,
+ 0 /* record type */,
+ 0 /* sysno */ ,
+ 0 /* match */,
+ 0 /* fname */,
+ buf, buf_size);
+}
+
+ZEBRA_RES zebra_update_record(ZebraHandle zh,
+ enum zebra_recctrl_action_t action,
+ const char *recordType,
+ zint *sysno, const char *match,
+ const char *fname,
+ const char *buf, int buf_size)
+{
+ ZEBRA_RES res;
+
+ ZEBRA_CHECK_HANDLE(zh);
+
+ assert(buf);
+
+ yaz_log(log_level, "zebra_update_record");
+ if (sysno)
+ yaz_log(log_level, " sysno=" ZINT_FORMAT, *sysno);
+
+ if (buf_size < 1)
+ buf_size = strlen(buf);
+
+ if (zebra_begin_trans(zh, 1) == ZEBRA_FAIL)
+ return ZEBRA_FAIL;
+ res = zebra_buffer_extract_record(zh, buf, buf_size,
+ action,
+ recordType,
+ sysno,
+ match,
+ fname);
+ if (zebra_end_trans(zh) != ZEBRA_OK)
+ {
+ yaz_log(YLOG_WARN, "zebra_end_trans failed");
+ res = ZEBRA_FAIL;
+ }
+ return res;
+}
+
+/* ---------------------------------------------------------------------------
+ Searching
+*/
+
+ZEBRA_RES zebra_search_PQF(ZebraHandle zh, const char *pqf_query,
+ const char *setname, zint *hits)
+{
+ zint lhits = 0;
+ ZEBRA_RES res = ZEBRA_OK;
+ Z_RPNQuery *query;
+ ODR odr;
+
+
+ ZEBRA_CHECK_HANDLE(zh);
+
+ odr = odr_createmem(ODR_ENCODE);
+
+ assert(pqf_query);
+ assert(setname);
+
+ yaz_log(log_level, "zebra_search_PQF s=%s q=%s", setname, pqf_query);
+
+ query = p_query_rpn(odr, pqf_query);
+
+ if (!query)
+ {
+ yaz_log(YLOG_WARN, "bad query %s\n", pqf_query);
+ zh->errCode = YAZ_BIB1_MALFORMED_QUERY;
+ res = ZEBRA_FAIL;