X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=perl%2Fzebra_api_ext.c;h=32289e98fc34e96d2c34f5088e0b3ef0f5486fb8;hb=a1dba281bafc701a7e958d6e7512a2dbb3027191;hp=10f069274bdd0296e7580af38c2ac7288fe31060;hpb=bb45d1f271522de94ba190f4024a27e2398f55fb;p=idzebra-moved-to-github.git diff --git a/perl/zebra_api_ext.c b/perl/zebra_api_ext.c index 10f0692..32289e9 100644 --- a/perl/zebra_api_ext.c +++ b/perl/zebra_api_ext.c @@ -16,6 +16,7 @@ #include "zebra_api_ext.h" #include "yaz/log.h" #include +#include #include void data1_print_tree(data1_handle dh, data1_node *n, FILE *out) { @@ -37,13 +38,13 @@ void init_recordGroup (recordGroup *rg) { rg->recordId = NULL; rg->recordType = NULL; rg->flagStoreData = -1; - rg->flagStoreKeys = -1; + rg->flagStoreKeys = -1; rg->flagRw = 1; rg->databaseNamePath = 0; - rg->explainDatabase = 0; - rg->fileVerboseLimit = 100000; + rg->explainDatabase = 0; + rg->fileVerboseLimit = 100000; rg->followLinks = -1; -} +} /* This is from extract.c... it seems useful, when extract_rec_in mem is @@ -52,11 +53,11 @@ void res_get_recordGroup (ZebraHandle zh, recordGroup *rGroup, const char *ext) { char gprefix[128]; - char ext_res[128]; + char ext_res[128]; if (!rGroup->groupName || !*rGroup->groupName) *gprefix = '\0'; - else + else sprintf (gprefix, "%s.", rGroup->groupName); /* determine file type - depending on extension */ @@ -68,18 +69,18 @@ void res_get_recordGroup (ZebraHandle zh, } } /* determine match criteria */ - if (!rGroup->recordId) { + if (!rGroup->recordId) { sprintf (ext_res, "%srecordId.%s", gprefix, ext); if (!(rGroup->recordId = res_get (zh->res, ext_res))) { sprintf (ext_res, "%srecordId", gprefix); rGroup->recordId = res_get (zh->res, ext_res); } - } + } /* determine database name */ if (!rGroup->databaseName) { sprintf (ext_res, "%sdatabase.%s", gprefix, ext); - if (!(rGroup->databaseName = res_get (zh->res, ext_res))) { + if (!(rGroup->databaseName = res_get (zh->res, ext_res))) { sprintf (ext_res, "%sdatabase", gprefix); rGroup->databaseName = res_get (zh->res, ext_res); } @@ -120,6 +121,10 @@ void res_get_recordGroup (ZebraHandle zh, } if (rGroup->flagStoreKeys == -1) rGroup->flagStoreKeys = 0; +} + +int zebra_trans_processed(ZebraTransactionStatus s) { + return (s.processed); } /* --------------------------------------------------------------------------- @@ -128,11 +133,11 @@ void res_get_recordGroup (ZebraHandle zh, If sysno is provided, then it's used to identify the reocord. If not, and match_criteria is provided, then sysno is guessed If not, and a record is provided, then sysno is got from there - */ int zebra_update_record (ZebraHandle zh, - struct recordGroup *rGroup, + struct recordGroup *rGroup, + const char *recordType, int sysno, const char *match, const char *fname, const char *buf, int buf_size) @@ -141,17 +146,20 @@ int zebra_update_record (ZebraHandle zh, if (buf_size < 1) buf_size = strlen(buf); + zebra_begin_trans(zh); res=bufferExtractRecord (zh, buf, buf_size, rGroup, - 0, // delete_flag - 0, // test_mode, - &sysno, - match, fname); - - return sysno; + 0, // delete_flag + 0, // test_mode, + recordType, + &sysno, + match, fname); + zebra_end_trans(zh); + return sysno; } int zebra_delete_record (ZebraHandle zh, struct recordGroup *rGroup, + const char *recordType, int sysno, const char *match, const char *fname, const char *buf, int buf_size) { @@ -159,12 +167,15 @@ int zebra_delete_record (ZebraHandle zh, if (buf_size < 1) buf_size = strlen(buf); + zebra_begin_trans(zh); res=bufferExtractRecord (zh, buf, buf_size, rGroup, 1, // delete_flag 0, // test_mode, + recordType, &sysno, match,fname); - return sysno; + zebra_end_trans(zh); + return sysno; } /* --------------------------------------------------------------------------- @@ -185,7 +196,7 @@ void zebra_search_RPN (ZebraHandle zh, ODR decode, ODR stream, resultSetAddRPN (zh, decode, stream, query, zh->num_basenames, zh->basenames, setname); - zebra_end_read (zh); + zebra_end_read (zh); *hits = zh->hits; } @@ -213,6 +224,29 @@ int zebra_search_PQF (ZebraHandle zh, return(hits); } +int zebra_cql2pqf (cql_transform_t ct, + const char *query, char *res, int len) { + + int status; + const char *addinfo = ""; + CQL_parser cp = cql_parser_create(); + + if (status = cql_parser_string(cp, query)) { + cql_parser_destroy(cp); + return (status); + } + + if (cql_transform_buf(ct, cql_parser_result(cp), res, len)) { + status = cql_transform_error(ct, &addinfo); + logf (LOG_WARN,"Transform error %d %s\n", status, addinfo ? addinfo : ""); + cql_parser_destroy(cp); + return (status); + } + + cql_parser_destroy(cp); + return (0); +} + void zebra_scan_PQF (ZebraHandle zh, ScanObj *so, ODR stream, @@ -277,13 +311,20 @@ void record_retrieve(RetrievalObj *ro, (RetrievalRecordBuf *) odr_malloc(stream, sizeof(*buf)); res->errCode = ro->records[i].errCode; - res->errString = ro->records[i].errString; + if (ro->records[i].errString) { + res->errString = odr_strdup(stream, ro->records[i].errString); + } else { + res->errString = ""; + } res->position = ro->records[i].position; res->base = ro->records[i].base; - res->format = ro->records[i].format; + res->format = (char *) + yaz_z3950_oid_value_to_str(ro->records[i].format, CLASS_RECSYN); res->buf = buf; res->buf->len = ro->records[i].len; res->buf->buf = ro->records[i].buf; + res->score = ro->records[i].score; + res->sysno = ro->records[i].sysno; } @@ -350,39 +391,40 @@ void records_retrieve(ZebraHandle zh, if (schema != VAL_NONE) { oident prefschema; - prefschema.proto = PROTO_Z3950; + prefschema.proto = PROTO_Z3950; prefschema.oclass = CLASS_SCHEMA; - prefschema.value = schema; - + prefschema.value = schema; + compo.which = Z_RecordComp_complex; compo.u.complex = (Z_CompSpec *) odr_malloc(stream, sizeof(*compo.u.complex)); compo.u.complex->selectAlternativeSyntax = (bool_t *) odr_malloc(stream, sizeof(bool_t)); *compo.u.complex->selectAlternativeSyntax = 0; - + compo.u.complex->generic = (Z_Specification *) odr_malloc(stream, sizeof(*compo.u.complex->generic)); - compo.u.complex->generic->schema = (Odr_oid *) + compo.u.complex->generic->which = Z_Schema_oid; + compo.u.complex->generic->schema.oid = (Odr_oid *) odr_oiddup(stream, oid_ent_to_oid(&prefschema, oid)); - - if (!compo.u.complex->generic->schema) { - /* OID wasn't a schema! Try record syntax instead. */ - prefschema.oclass = CLASS_RECSYN; - compo.u.complex->generic->schema = (Odr_oid *) - odr_oiddup(stream, oid_ent_to_oid(&prefschema, oid)); - } - - if (!elementSetNames) { + if (!compo.u.complex->generic->schema.oid) + { + /* OID wasn't a schema! Try record syntax instead. */ + prefschema.oclass = CLASS_RECSYN; + compo.u.complex->generic->schema.oid = (Odr_oid *) + odr_oiddup(stream, oid_ent_to_oid(&prefschema, oid)); + } + if (!elementSetNames) compo.u.complex->generic->elementSpec = 0; - } else { - compo.u.complex->generic->elementSpec = (Z_ElementSpec *) - odr_malloc(stream, sizeof(Z_ElementSpec)); - compo.u.complex->generic->elementSpec->which = - Z_ElementSpec_elementSetName; - compo.u.complex->generic->elementSpec->u.elementSetName = - elementSetNames->u.generic; - } + else + { + compo.u.complex->generic->elementSpec = (Z_ElementSpec *) + odr_malloc(stream, sizeof(Z_ElementSpec)); + compo.u.complex->generic->elementSpec->which = + Z_ElementSpec_elementSetName; + compo.u.complex->generic->elementSpec->u.elementSetName = + elementSetNames->u.generic; + } compo.u.complex->num_dbSpecific = 0; compo.u.complex->dbSpecific = 0; compo.u.complex->num_recordSyntax = 0; @@ -400,12 +442,16 @@ void records_retrieve(ZebraHandle zh, res->noOfRecords, res->records); } else { api_records_retrieve (zh, stream, setname, - &compo, + &compo, recordsyntax, res->noOfRecords, res->records); } } + +int zebra_trans_no (ZebraHandle zh) { + return (zh->trans_no); +} /* almost the same as zebra_records_retrieve ... but how did it work? I mean for multiple records ??? CHECK ??? */ @@ -424,7 +470,7 @@ void api_records_retrieve (ZebraHandle zh, ODR stream, return; } - zh->errCode = 0; + zh->errCode = 0; if (zebra_begin_read (zh)) return; @@ -450,6 +496,7 @@ void api_records_retrieve (ZebraHandle zh, ODR stream, recs[i].len = strlen(poset[i].term); recs[i].buf = poset[i].term; recs[i].base = poset[i].db; + recs[i].sysno = 0; } else if (poset[i].sysno) @@ -465,7 +512,9 @@ void api_records_retrieve (ZebraHandle zh, ODR stream, &recs[i].base); recs[i].buf = (char *) odr_malloc(stream,recs[i].len); memcpy(recs[i].buf, b, recs[i].len); - recs[i].errString = NULL; + recs[i].errString = 0; /* Hmmm !!! we should get this */ + recs[i].sysno = poset[i].sysno; + recs[i].score = poset[i].score; } else {