From: Wolfram Schneider Date: Tue, 16 Dec 2008 18:10:33 +0000 (+0100) Subject: Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/pazpar2 X-Git-Tag: v1.1.0~57 X-Git-Url: http://git.indexdata.com/?a=commitdiff_plain;h=abe1c8f35b9cbcf772f10cf9646dffa83305c26f;hp=e0fd929c14a4b675290d3179239a5e6a45e55418;p=pazpar2-moved-to-github.git Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/pazpar2 --- diff --git a/NEWS b/NEWS index 0f1f78b..45508d7 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,5 @@ +Automatically computes pz:nativesyntax if not provided (works for XML and MARC) + --- 1.0.13 2008/11/24 Command bytarget returns name of target (if defined). diff --git a/doc/pazpar2_conf.xml b/doc/pazpar2_conf.xml index f81464a..b3a6281 100644 --- a/doc/pazpar2_conf.xml +++ b/doc/pazpar2_conf.xml @@ -714,6 +714,10 @@ For iso2709, can also specify a native character set, e.g. "iso2709;latin-1". If no character set is provided, MARC-8 is assumed. + + If pz:nativesyntax is not specified, pazpar2 will attempt to determine + the value based on the response from the server. + diff --git a/src/client.c b/src/client.c index ff3c0fb..9cb5140 100644 --- a/src/client.c +++ b/src/client.c @@ -271,7 +271,7 @@ static void client_send_raw_present(struct client *cl) connection_continue(co); } -static int nativesyntax_to_type(struct session_database *sdb, char *type) +static int nativesyntax_to_type(struct session_database *sdb, char *type, ZOOM_record rec) { const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX); @@ -290,7 +290,25 @@ static int nativesyntax_to_type(struct session_database *sdb, char *type) return -1; return 0; } - return -1; + else /* attempt to deduce structure */ + { + const char *syntax = ZOOM_record_get(rec, "syntax", NULL); + if (syntax) + { + if (!strcmp(syntax, "XML")) + { + strcpy(type, "xml"); + return 0; + } + else if (!strcmp(syntax, "USmarc") || !strcmp(syntax, "MARC21")) + { + strcpy(type, "xml; charset=marc8-s"); + return 0; + } + else return -1; + } + else return -1; + } } static void ingest_raw_record(struct client *cl, ZOOM_record rec) @@ -304,7 +322,7 @@ static void ingest_raw_record(struct client *cl, ZOOM_record rec) else { struct session_database *sdb = client_get_database(cl); - nativesyntax_to_type(sdb, type); + nativesyntax_to_type(sdb, type, rec); } buf = ZOOM_record_get(rec, type, &len); @@ -383,7 +401,8 @@ void client_record_response(struct client *cl) struct session_database *sdb = client_get_database(cl); const char *xmlrec; char type[80]; - nativesyntax_to_type(sdb, type); + if (nativesyntax_to_type(sdb, type, rec)) + yaz_log(YLOG_WARN, "Failed to determine record type"); if ((xmlrec = ZOOM_record_get(rec, type, NULL))) { if (ingest_record(cl, xmlrec, cl->record_offset))