From ac5747296ef5b85e2125da04fa1f7d33852ad971 Mon Sep 17 00:00:00 2001 From: pop Date: Tue, 4 Mar 2003 23:05:30 +0000 Subject: [PATCH] First cleanup, zebra_api_ext.c is epmty now --- index/zebraapi.c | 323 ++++++++++++++++++++++++++++- perl/IDZebra.i | 3 - perl/IDZebra_wrap.c | 221 +++++++++++++++++--- perl/MANIFEST | 3 + perl/lib/IDZebra.pm | 73 ++++++- perl/zebra_api_ext.c | 547 -------------------------------------------------- perl/zebra_perl.c | 239 +++++++++++++++++++++- perl/zebra_perl.h | 7 +- 8 files changed, 829 insertions(+), 587 deletions(-) diff --git a/index/zebraapi.c b/index/zebraapi.c index abc9124..e3b7f8e 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.86 2003-02-27 23:08:10 pop Exp $ +/* $Id: zebraapi.c,v 1.87 2003-03-04 23:05:30 pop Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -35,6 +35,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "index.h" #include +#include "zebraapi.h" /* simple asserts to validate the most essential input args */ #define ASSERTZH assert(zh && zh->service) @@ -1568,3 +1569,323 @@ const char *zebra_get_resource(ZebraHandle zh, zh->errCode=0; return res_get_def( zh->res, name, (char *)defaultvalue); } + +/* moved from zebra_api_ext.c by pop */ + +int zebra_trans_no (ZebraHandle zh) { + return (zh->trans_no); +} + + + +int zebra_get_shadow_enable (ZebraHandle zh) { + return (zh->shadow_enable); +} + +void zebra_set_shadow_enable (ZebraHandle zh, int value) { + zh->shadow_enable = value; +} + +void init_recordGroup (struct recordGroup *rg) { + rg->groupName = NULL; + rg->databaseName = NULL; + rg->path = NULL; + rg->recordId = NULL; + rg->recordType = NULL; + rg->flagStoreData = -1; + rg->flagStoreKeys = -1; + rg->flagRw = 1; + rg->databaseNamePath = 0; + rg->explainDatabase = 0; + rg->fileVerboseLimit = 100000; + rg->followLinks = -1; +} + + +/* This is from extract.c... it seems useful, when extract_rec_in mem is + called... and in general... Should be moved to somewhere else */ +void res_get_recordGroup (ZebraHandle zh, + struct recordGroup *rGroup, + const char *ext) { + char gprefix[128]; + char ext_res[128]; + + if (!rGroup->groupName || !*rGroup->groupName) + *gprefix = '\0'; + else + sprintf (gprefix, "%s.", rGroup->groupName); + + /* determine file type - depending on extension */ + if (!rGroup->recordType) { + sprintf (ext_res, "%srecordType.%s", gprefix, ext); + if (!(rGroup->recordType = res_get (zh->res, ext_res))) { + sprintf (ext_res, "%srecordType", gprefix); + rGroup->recordType = res_get (zh->res, ext_res); + } + } + /* determine match criteria */ + 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))) { + sprintf (ext_res, "%sdatabase", gprefix); + rGroup->databaseName = res_get (zh->res, ext_res); + } + } + if (!rGroup->databaseName) + rGroup->databaseName = "Default"; + + /* determine if explain database */ + sprintf (ext_res, "%sexplainDatabase", gprefix); + rGroup->explainDatabase = + atoi (res_get_def (zh->res, ext_res, "0")); + + /* storeData */ + if (rGroup->flagStoreData == -1) { + const char *sval; + sprintf (ext_res, "%sstoreData.%s", gprefix, ext); + if (!(sval = res_get (zh->res, ext_res))) { + sprintf (ext_res, "%sstoreData", gprefix); + sval = res_get (zh->res, ext_res); + } + if (sval) + rGroup->flagStoreData = atoi (sval); + } + if (rGroup->flagStoreData == -1) rGroup->flagStoreData = 0; + + /* storeKeys */ + if (rGroup->flagStoreKeys == -1) { + const char *sval; + + sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext); + sval = res_get (zh->res, ext_res); + if (!sval) { + sprintf (ext_res, "%sstoreKeys", gprefix); + sval = res_get (zh->res, ext_res); + } + if (!sval) sval = res_get (zh->res, "storeKeys"); + if (sval) rGroup->flagStoreKeys = atoi (sval); + } + if (rGroup->flagStoreKeys == -1) rGroup->flagStoreKeys = 0; + +} + + +/* almost the same as zebra_records_retrieve ... but how did it work? + I mean for multiple records ??? CHECK ??? */ +void api_records_retrieve (ZebraHandle zh, ODR stream, + const char *setname, Z_RecordComposition *comp, + oid_value input_format, int num_recs, + ZebraRetrievalRecord *recs) +{ + ZebraPosSet poset; + int i, *pos_array; + + if (!zh->res) + { + zh->errCode = 30; + zh->errString = odr_strdup (stream, setname); + return; + } + + zh->errCode = 0; + + if (zebra_begin_read (zh)) + return; + + pos_array = (int *) xmalloc (num_recs * sizeof(*pos_array)); + for (i = 0; ierrCode = 30; + zh->errString = nmem_strdup (stream->mem, setname); + } + else + { + for (i = 0; ierrCode = 13; + zh->errString = odr_strdup (stream, num_str); + break; + } + + } + zebraPosSetDestroy (zh, poset, num_recs); + } + zebra_end_read (zh); + xfree (pos_array); +} + + +/* --------------------------------------------------------------------------- + Record insert(=update), delete + + 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, + const char *recordType, + int sysno, const char *match, const char *fname, + const char *buf, int buf_size) + +{ + int res; + + 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, + 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) +{ + int res; + + 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); + zebra_end_trans(zh); + return sysno; +} + +/* --------------------------------------------------------------------------- + Searching + + zebra_search_RPN is the same as zebra_search_rpn, except that read locking + is not mandatory. (it's repeatable now, also in zebraapi.c) +*/ + +void zebra_search_RPN (ZebraHandle zh, ODR decode, ODR stream, + Z_RPNQuery *query, const char *setname, int *hits) +{ + zh->hits = 0; + *hits = 0; + + if (zebra_begin_read (zh)) + return; + resultSetAddRPN (zh, decode, stream, query, + zh->num_basenames, zh->basenames, setname); + + zebra_end_read (zh); + + *hits = zh->hits; +} + +int zebra_search_PQF (ZebraHandle zh, + ODR odr_input, ODR odr_output, + const char *pqf_query, + const char *setname) + +{ + int hits; + Z_RPNQuery *query; + query = p_query_rpn (odr_input, PROTO_Z3950, pqf_query); + + if (!query) { + logf (LOG_WARN, "bad query %s\n", pqf_query); + odr_reset (odr_input); + return(0); + } + zebra_search_RPN (zh, odr_input, odr_output, query, setname, &hits); + + odr_reset (odr_input); + odr_reset (odr_output); + + return(hits); +} + +/* --------------------------------------------------------------------------- + Sort - a simplified interface, with optional read locks. +*/ +int sort (ZebraHandle zh, + ODR stream, + const char *sort_spec, + const char *output_setname, + const char **input_setnames + ) +{ + int num_input_setnames = 0; + int sort_status = 0; + Z_SortKeySpecList *sort_sequence = yaz_sort_spec (stream, sort_spec); + if (!sort_sequence) { + logf(LOG_WARN,"invalid sort specs '%s'", sort_spec); + zh->errCode = 207; + return (-1); + } + + /* we can do this, since the perl typemap code for char** will + put a NULL at the end of list */ + while (input_setnames[num_input_setnames]) num_input_setnames++; + + if (zebra_begin_read (zh)) + return; + + resultSetSort (zh, stream->mem, num_input_setnames, input_setnames, + output_setname, sort_sequence, &sort_status); + + zebra_end_read(zh); + return (sort_status); +} diff --git a/perl/IDZebra.i b/perl/IDZebra.i index 2031e8b..7f5e063 100644 --- a/perl/IDZebra.i +++ b/perl/IDZebra.i @@ -3,7 +3,6 @@ %{ #include "zebraapi.h" -#include "zebra_api_ext.h" #include "zebra_perl.h" #include "data1.h" #include "yaz/odr.h" @@ -200,8 +199,6 @@ int zebra_trans_no (ZebraHandle zh); %name(begin_read) int zebra_begin_read (ZebraHandle zh); -void zts_test (ZebraTransactionStatus *stat); - /* end retrieval (remove read lock) (zebraapi.c) */ %name(end_read) void zebra_end_read (ZebraHandle zh); diff --git a/perl/IDZebra_wrap.c b/perl/IDZebra_wrap.c index a5afdc0..efbe3b8 100644 --- a/perl/IDZebra_wrap.c +++ b/perl/IDZebra_wrap.c @@ -212,7 +212,7 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { * perl5.swg * * Perl5 runtime library - * $Header: /home/cvsroot/idis/perl/Attic/IDZebra_wrap.c,v 1.10 2003-03-04 19:33:52 pop Exp $ + * $Header: /home/cvsroot/idis/perl/Attic/IDZebra_wrap.c,v 1.11 2003-03-04 23:05:31 pop Exp $ * ----------------------------------------------------------------------------- */ #define SWIGPERL @@ -566,7 +566,6 @@ SWIGEXPORT(void) SWIG_init (CV *cv, CPerlObj *); #include "zebraapi.h" -#include "zebra_api_ext.h" #include "zebra_perl.h" #include "data1.h" #include "yaz/odr.h" @@ -1550,6 +1549,187 @@ XS(_wrap_delete_RetrievalObj) { } +XS(_wrap_RetrievalRecordBuf_buf_set) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *arg1 ; + char *arg2 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RetrievalRecordBuf_buf_set(self,buf);"); + } + { + if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_RetrievalRecordBuf,0) < 0) { + SWIG_croak("Type error in argument 1 of RetrievalRecordBuf_buf_set. Expected _p_RetrievalRecordBuf"); + } + } + if (!SvOK((SV*) ST(1))) arg2 = 0; + else arg2 = (char *) SvPV(ST(1), PL_na); + { + if (arg1->buf) free((char*)arg1->buf); + arg1->buf = (char *) malloc(strlen(arg2)+1); + strcpy((char*)arg1->buf,arg2); + } + + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + +XS(_wrap_RetrievalRecordBuf_buf_get) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *arg1 ; + char *result; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RetrievalRecordBuf_buf_get(self);"); + } + { + if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_RetrievalRecordBuf,0) < 0) { + SWIG_croak("Type error in argument 1 of RetrievalRecordBuf_buf_get. Expected _p_RetrievalRecordBuf"); + } + } + result = (char *) ((arg1)->buf); + + ST(argvi) = sv_newmortal(); + if (result) { + sv_setpv((SV*)ST(argvi++), (char *) result); + }else { + sv_setsv((SV*)ST(argvi++), &PL_sv_undef); + } + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + +XS(_wrap_RetrievalRecordBuf_len_set) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *arg1 ; + int arg2 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RetrievalRecordBuf_len_set(self,len);"); + } + { + if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_RetrievalRecordBuf,0) < 0) { + SWIG_croak("Type error in argument 1 of RetrievalRecordBuf_len_set. Expected _p_RetrievalRecordBuf"); + } + } + arg2 = (int) SvIV(ST(1)); + if (arg1) (arg1)->len = arg2; + + + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + +XS(_wrap_RetrievalRecordBuf_len_get) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *arg1 ; + int result; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RetrievalRecordBuf_len_get(self);"); + } + { + if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_RetrievalRecordBuf,0) < 0) { + SWIG_croak("Type error in argument 1 of RetrievalRecordBuf_len_get. Expected _p_RetrievalRecordBuf"); + } + } + result = (int) ((arg1)->len); + + ST(argvi) = sv_newmortal(); + sv_setiv(ST(argvi++), (IV) result); + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + +XS(_wrap_new_RetrievalRecordBuf) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *result; + int argvi = 0; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: new_RetrievalRecordBuf();"); + } + result = (RetrievalRecordBuf *)(RetrievalRecordBuf *) calloc(1, sizeof(RetrievalRecordBuf)); + + { + if (result->len) { + ST(argvi) = newSVpv(result->buf,result->len); + }else { + ST(argvi) = newSVpv("",0); + } + sv_2mortal(ST(argvi)); + argvi++; + } + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + +XS(_wrap_delete_RetrievalRecordBuf) { + char _swigmsg[SWIG_MAX_ERRMSG] = ""; + const char *_swigerr = _swigmsg; + { + RetrievalRecordBuf *arg1 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_RetrievalRecordBuf(self);"); + } + { + if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_RetrievalRecordBuf,0) < 0) { + SWIG_croak("Type error in argument 1 of delete_RetrievalRecordBuf. Expected _p_RetrievalRecordBuf"); + } + } + free((char *) arg1); + + + XSRETURN(argvi); + fail: + (void) _swigerr; + } + croak(_swigerr); +} + + XS(_wrap_RetrievalRecord_errCode_set) { char _swigmsg[SWIG_MAX_ERRMSG] = ""; const char *_swigerr = _swigmsg; @@ -3735,33 +3915,6 @@ XS(_wrap_begin_read) { } -XS(_wrap_zts_test) { - char _swigmsg[SWIG_MAX_ERRMSG] = ""; - const char *_swigerr = _swigmsg; - { - ZebraTransactionStatus *arg1 ; - int argvi = 0; - dXSARGS; - - if ((items < 1) || (items > 1)) { - SWIG_croak("Usage: zts_test(stat);"); - } - { - if (SWIG_ConvertPtr(ST(0), (void **) &arg1, SWIGTYPE_p_ZebraTransactionStatus,0) < 0) { - SWIG_croak("Type error in argument 1 of zts_test. Expected _p_ZebraTransactionStatus"); - } - } - zts_test(arg1); - - - XSRETURN(argvi); - fail: - (void) _swigerr; - } - croak(_swigerr); -} - - XS(_wrap_end_read) { char _swigmsg[SWIG_MAX_ERRMSG] = ""; const char *_swigerr = _swigmsg; @@ -8306,7 +8459,7 @@ static swig_type_info _swigt__p_Z_Espec1[] = {{"_p_Z_Espec1", 0, "Z_Espec1 *", 0 static swig_type_info _swigt__p_off_t[] = {{"_p_off_t", 0, "off_t *", 0},{"_p_off_t"},{0}}; static swig_type_info _swigt__p_Odr_oid[] = {{"_p_Odr_oid", 0, "Odr_oid *", 0},{"_p_Odr_oid"},{0}}; static swig_type_info _swigt__p_data1_varset[] = {{"_p_data1_varset", 0, "data1_varset *", 0},{"_p_data1_varset"},{0}}; -static swig_type_info _swigt__p_RetrievalRecordBuf[] = {{"_p_RetrievalRecordBuf", 0, "RetrievalRecordBuf *", 0},{"_p_RetrievalRecordBuf"},{0}}; +static swig_type_info _swigt__p_RetrievalRecordBuf[] = {{"IDZebra::RetrievalRecordBuf", 0, "RetrievalRecordBuf *", 0},{"IDZebra::RetrievalRecordBuf"},{0}}; static swig_type_info _swigt__p_perl_context[] = {{"_p_perl_context", 0, "struct perl_context *", 0},{"_p_perl_context"},{0}}; static swig_type_info _swigt__p_data1_node[] = {{"_p_data1_node", 0, "data1_node *", 0},{"_p_data1_node"},{0}}; static swig_type_info _swigt__p_ScanObj[] = {{"IDZebra::ScanObj", 0, "ScanObj *", 0},{"IDZebra::ScanObj"},{0}}; @@ -8465,6 +8618,12 @@ static swig_command_info swig_commands[] = { {"IDZebrac::RetrievalObj_records_get", _wrap_RetrievalObj_records_get}, {"IDZebrac::new_RetrievalObj", _wrap_new_RetrievalObj}, {"IDZebrac::delete_RetrievalObj", _wrap_delete_RetrievalObj}, +{"IDZebrac::RetrievalRecordBuf_buf_set", _wrap_RetrievalRecordBuf_buf_set}, +{"IDZebrac::RetrievalRecordBuf_buf_get", _wrap_RetrievalRecordBuf_buf_get}, +{"IDZebrac::RetrievalRecordBuf_len_set", _wrap_RetrievalRecordBuf_len_set}, +{"IDZebrac::RetrievalRecordBuf_len_get", _wrap_RetrievalRecordBuf_len_get}, +{"IDZebrac::new_RetrievalRecordBuf", _wrap_new_RetrievalRecordBuf}, +{"IDZebrac::delete_RetrievalRecordBuf", _wrap_delete_RetrievalRecordBuf}, {"IDZebrac::RetrievalRecord_errCode_set", _wrap_RetrievalRecord_errCode_set}, {"IDZebrac::RetrievalRecord_errCode_get", _wrap_RetrievalRecord_errCode_get}, {"IDZebrac::RetrievalRecord_errString_set", _wrap_RetrievalRecord_errString_set}, @@ -8537,7 +8696,6 @@ static swig_command_info swig_commands[] = { {"IDZebrac::end_trans", _wrap_end_trans}, {"IDZebrac::trans_no", _wrap_trans_no}, {"IDZebrac::begin_read", _wrap_begin_read}, -{"IDZebrac::zts_test", _wrap_zts_test}, {"IDZebrac::end_read", _wrap_end_read}, {"IDZebrac::commit", _wrap_commit}, {"IDZebrac::get_shadow_enable", _wrap_get_shadow_enable}, @@ -8708,6 +8866,7 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_recordGroup, (void*) "IDZebra::recordGroup"); SWIG_TypeClientData(SWIGTYPE_p_RetrievalObj, (void*) "IDZebra::RetrievalObj"); + SWIG_TypeClientData(SWIGTYPE_p_RetrievalRecordBuf, (void*) "IDZebra::RetrievalRecordBuf"); SWIG_TypeClientData(SWIGTYPE_p_RetrievalRecord, (void*) "IDZebra::RetrievalRecord"); SWIG_TypeClientData(SWIGTYPE_p_scanEntry, (void*) "IDZebra::scanEntry"); SWIG_TypeClientData(SWIGTYPE_p_ScanObj, (void*) "IDZebra::ScanObj"); diff --git a/perl/MANIFEST b/perl/MANIFEST index f293370..95990d1 100644 --- a/perl/MANIFEST +++ b/perl/MANIFEST @@ -10,6 +10,9 @@ demo/index.sh demo/pod.abs demo/pod.pm demo/zebra.cfg +demo/register +demo/lock +demo/tmp lib/IDZebra.pm lib/IDZebra/Data1.pm lib/IDZebra/Filter.pm diff --git a/perl/lib/IDZebra.pm b/perl/lib/IDZebra.pm index e41d642..dd9365b 100644 --- a/perl/lib/IDZebra.pm +++ b/perl/lib/IDZebra.pm @@ -57,7 +57,6 @@ package IDZebra; *end_trans = *IDZebrac::end_trans; *trans_no = *IDZebrac::trans_no; *begin_read = *IDZebrac::begin_read; -*zts_test = *IDZebrac::zts_test; *end_read = *IDZebrac::end_read; *commit = *IDZebrac::commit; *get_shadow_enable = *IDZebrac::get_shadow_enable; @@ -335,12 +334,84 @@ sub STORE { } +############# Class : IDZebra::RetrievalRecordBuf ############## + +package IDZebra::RetrievalRecordBuf; +@ISA = qw( IDZebra ); +%OWNER = (); +%BLESSEDMEMBERS = ( +); + +%ITERATORS = (); +*swig_buf_get = *IDZebrac::RetrievalRecordBuf_buf_get; +*swig_buf_set = *IDZebrac::RetrievalRecordBuf_buf_set; +*swig_len_get = *IDZebrac::RetrievalRecordBuf_len_get; +*swig_len_set = *IDZebrac::RetrievalRecordBuf_len_set; +sub new { + my $pkg = shift; + my @args = @_; + my $self = IDZebrac::new_RetrievalRecordBuf(@args); + return undef if (!defined($self)); + $OWNER{$self} = 1; + my %retval; + tie %retval, "IDZebra::RetrievalRecordBuf", $self; + return bless \%retval, $pkg; +} + +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + IDZebrac::delete_RetrievalRecordBuf($self); + delete $OWNER{$self}; + } +} + +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; + }; + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; + }; + +sub FETCH { + my ($self,$field) = @_; + my $member_func = "swig_${field}_get"; + my $val = $self->$member_func(); + if (exists $BLESSEDMEMBERS{$field}) { + return undef if (!defined($val)); + my %retval; + tie %retval,$BLESSEDMEMBERS{$field},$val; + return bless \%retval, $BLESSEDMEMBERS{$field}; + } + return $val; +} + +sub STORE { + my ($self,$field,$newval) = @_; + my $member_func = "swig_${field}_set"; + if (exists $BLESSEDMEMBERS{$field}) { + $self->$member_func(tied(%{$newval})); + } else { + $self->$member_func($newval); + } +} + + ############# Class : IDZebra::RetrievalRecord ############## package IDZebra::RetrievalRecord; @ISA = qw( IDZebra ); %OWNER = (); %BLESSEDMEMBERS = ( + buf => 'IDZebra::RetrievalRecordBuf', ); %ITERATORS = (); diff --git a/perl/zebra_api_ext.c b/perl/zebra_api_ext.c index 32f9f27..0ec92dc 100644 --- a/perl/zebra_api_ext.c +++ b/perl/zebra_api_ext.c @@ -16,553 +16,6 @@ #include "zebra_api_ext.h" #include "yaz/log.h" #include -#include #include -void data1_print_tree(data1_handle dh, data1_node *n, FILE *out) { - data1_pr_tree(dh, n, stdout); -} -int zebra_get_shadow_enable (ZebraHandle zh) { - return (zh->shadow_enable); -} - -void zebra_set_shadow_enable (ZebraHandle zh, int value) { - zh->shadow_enable = value; -} - -void init_recordGroup (recordGroup *rg) { - rg->groupName = NULL; - rg->databaseName = NULL; - rg->path = NULL; - rg->recordId = NULL; - rg->recordType = NULL; - rg->flagStoreData = -1; - rg->flagStoreKeys = -1; - rg->flagRw = 1; - rg->databaseNamePath = 0; - rg->explainDatabase = 0; - rg->fileVerboseLimit = 100000; - rg->followLinks = -1; -} - - -/* This is from extract.c... it seems useful, when extract_rec_in mem is - called... and in general... Should be moved to somewhere else */ -void res_get_recordGroup (ZebraHandle zh, - recordGroup *rGroup, - const char *ext) { - char gprefix[128]; - char ext_res[128]; - - if (!rGroup->groupName || !*rGroup->groupName) - *gprefix = '\0'; - else - sprintf (gprefix, "%s.", rGroup->groupName); - - /* determine file type - depending on extension */ - if (!rGroup->recordType) { - sprintf (ext_res, "%srecordType.%s", gprefix, ext); - if (!(rGroup->recordType = res_get (zh->res, ext_res))) { - sprintf (ext_res, "%srecordType", gprefix); - rGroup->recordType = res_get (zh->res, ext_res); - } - } - /* determine match criteria */ - 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))) { - sprintf (ext_res, "%sdatabase", gprefix); - rGroup->databaseName = res_get (zh->res, ext_res); - } - } - if (!rGroup->databaseName) - rGroup->databaseName = "Default"; - - /* determine if explain database */ - sprintf (ext_res, "%sexplainDatabase", gprefix); - rGroup->explainDatabase = - atoi (res_get_def (zh->res, ext_res, "0")); - - /* storeData */ - if (rGroup->flagStoreData == -1) { - const char *sval; - sprintf (ext_res, "%sstoreData.%s", gprefix, ext); - if (!(sval = res_get (zh->res, ext_res))) { - sprintf (ext_res, "%sstoreData", gprefix); - sval = res_get (zh->res, ext_res); - } - if (sval) - rGroup->flagStoreData = atoi (sval); - } - if (rGroup->flagStoreData == -1) rGroup->flagStoreData = 0; - - /* storeKeys */ - if (rGroup->flagStoreKeys == -1) { - const char *sval; - - sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext); - sval = res_get (zh->res, ext_res); - if (!sval) { - sprintf (ext_res, "%sstoreKeys", gprefix); - sval = res_get (zh->res, ext_res); - } - if (!sval) sval = res_get (zh->res, "storeKeys"); - if (sval) rGroup->flagStoreKeys = atoi (sval); - } - if (rGroup->flagStoreKeys == -1) rGroup->flagStoreKeys = 0; - -} - -int zebra_trans_processed(ZebraTransactionStatus s) { - return (s.processed); -} - -/* --------------------------------------------------------------------------- - Record insert(=update), delete - - 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, - const char *recordType, - int sysno, const char *match, const char *fname, - const char *buf, int buf_size) - -{ - int res; - - 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, - 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) -{ - int res; - - 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); - zebra_end_trans(zh); - return sysno; -} - -/* --------------------------------------------------------------------------- - Searching - - zebra_search_RPN is the same as zebra_search_rpn, except that read locking - is not mandatory. (it's repeatable now, also in zebraapi.c) -*/ - -void zebra_search_RPN (ZebraHandle zh, ODR decode, ODR stream, - Z_RPNQuery *query, const char *setname, int *hits) -{ - zh->hits = 0; - *hits = 0; - - if (zebra_begin_read (zh)) - return; - resultSetAddRPN (zh, decode, stream, query, - zh->num_basenames, zh->basenames, setname); - - zebra_end_read (zh); - - *hits = zh->hits; -} - -int zebra_search_PQF (ZebraHandle zh, - ODR odr_input, ODR odr_output, - const char *pqf_query, - const char *setname) - -{ - int hits; - Z_RPNQuery *query; - query = p_query_rpn (odr_input, PROTO_Z3950, pqf_query); - - if (!query) { - logf (LOG_WARN, "bad query %s\n", pqf_query); - odr_reset (odr_input); - return(0); - } - zebra_search_RPN (zh, odr_input, odr_output, query, setname, &hits); - - odr_reset (odr_input); - odr_reset (odr_output); - - 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, - const char *pqf_query) -{ - Z_AttributesPlusTerm *zapt; - Odr_oid *attrsetid; - const char* oidname; - oid_value attributeset; - ZebraScanEntry *entries; - int i, class; - - logf(LOG_DEBUG, - "scan req: pos:%d, num:%d, partial:%d", - so->position, so->num_entries, so->is_partial); - - zapt = p_query_scan (stream, PROTO_Z3950, &attrsetid, pqf_query); - - oidname = yaz_z3950oid_to_str (attrsetid, &class); - logf (LOG_DEBUG, "Attributreset: %s", oidname); - attributeset = oid_getvalbyname(oidname); - - if (!zapt) { - logf (LOG_WARN, "bad query %s\n", pqf_query); - odr_reset (stream); - return; - } - - so->entries = (scanEntry *) - odr_malloc (stream, sizeof(so->entries) * (so->num_entries)); - - - zebra_scan (zh, stream, zapt, attributeset, - &so->position, &so->num_entries, - (ZebraScanEntry **) &so->entries, &so->is_partial); - - logf(LOG_DEBUG, - "scan res: pos:%d, num:%d, partial:%d", - so->position, so->num_entries, so->is_partial); -} - -scanEntry *getScanEntry(ScanObj *so, int pos) { - return (&so->entries[pos-1]); -} - -/* --------------------------------------------------------------------------- - Record retrieval - 2 phase retrieval - I didn't manage to return array of blessed references - to wrapped structures... it's feasible, but I'll need some time - / pop - 2002-11-17 -*/ - -void record_retrieve(RetrievalObj *ro, - ODR stream, - RetrievalRecord *res, - int pos) -{ - int i = pos - 1; - - - RetrievalRecordBuf *buf = - (RetrievalRecordBuf *) odr_malloc(stream, sizeof(*buf)); - - res->errCode = ro->records[i].errCode; - 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 = (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; - -} - -/* most of the code here was copied from yaz-client */ -void records_retrieve(ZebraHandle zh, - ODR stream, - const char *setname, - const char *a_eset, - const char *a_schema, - const char *a_format, - int from, - int to, - RetrievalObj *res) -{ - static enum oid_value recordsyntax = VAL_SUTRS; - static enum oid_value schema = VAL_NONE; - static Z_ElementSetNames *elementSetNames = 0; - static Z_RecordComposition compo; - static Z_ElementSetNames esn; - static char what[100]; - int i; - int oid[OID_SIZE]; - - compo.which = -1; - - if (from < 1) from = 1; - if (from > to) to = from; - res->noOfRecords = to - from + 1; - - res->records = odr_malloc (stream, - sizeof(*res->records) * (res->noOfRecords)); - - for (i = 0; inoOfRecords; i++) res->records[i].position = from+i; - - if (!a_eset || !*a_eset) { - elementSetNames = 0; - } else { - strcpy(what, a_eset); - esn.which = Z_ElementSetNames_generic; - esn.u.generic = what; - elementSetNames = &esn; - } - - if (!a_schema || !*a_schema) { - schema = VAL_NONE; - } else { - schema = oid_getvalbyname (a_schema); - if (schema == VAL_NONE) { - logf(LOG_WARN,"unknown schema '%s'",a_schema); - } - } - - - if (!a_format || !*a_format) { - recordsyntax = VAL_SUTRS; - } else { - recordsyntax = oid_getvalbyname (a_format); - if (recordsyntax == VAL_NONE) { - logf(LOG_WARN,"unknown record syntax '%s', using SUTRS",a_schema); - recordsyntax = VAL_SUTRS; - } - } - - if (schema != VAL_NONE) { - oident prefschema; - - prefschema.proto = PROTO_Z3950; - prefschema.oclass = CLASS_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->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) - { - /* 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; - } - compo.u.complex->num_dbSpecific = 0; - compo.u.complex->dbSpecific = 0; - compo.u.complex->num_recordSyntax = 0; - compo.u.complex->recordSyntax = 0; - } - else if (elementSetNames) { - compo.which = Z_RecordComp_simple; - compo.u.simple = elementSetNames; - } - - if (compo.which == -1) { - api_records_retrieve (zh, stream, setname, - NULL, - recordsyntax, - res->noOfRecords, res->records); - } else { - api_records_retrieve (zh, stream, setname, - &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 ??? */ -void api_records_retrieve (ZebraHandle zh, ODR stream, - const char *setname, Z_RecordComposition *comp, - oid_value input_format, int num_recs, - ZebraRetrievalRecord *recs) -{ - ZebraPosSet poset; - int i, *pos_array; - - if (!zh->res) - { - zh->errCode = 30; - zh->errString = odr_strdup (stream, setname); - return; - } - - zh->errCode = 0; - - if (zebra_begin_read (zh)) - return; - - pos_array = (int *) xmalloc (num_recs * sizeof(*pos_array)); - for (i = 0; ierrCode = 30; - zh->errString = nmem_strdup (stream->mem, setname); - } - else - { - for (i = 0; ierrCode = 13; - zh->errString = odr_strdup (stream, num_str); - break; - } - - } - zebraPosSetDestroy (zh, poset, num_recs); - } - zebra_end_read (zh); - xfree (pos_array); -} - - -/* --------------------------------------------------------------------------- - Sort - a simplified interface, with optional read locks. -*/ -int sort (ZebraHandle zh, - ODR stream, - const char *sort_spec, - const char *output_setname, - const char **input_setnames - ) -{ - int num_input_setnames = 0; - int sort_status = 0; - Z_SortKeySpecList *sort_sequence = yaz_sort_spec (stream, sort_spec); - if (!sort_sequence) { - logf(LOG_WARN,"invalid sort specs '%s'", sort_spec); - zh->errCode = 207; - return (-1); - } - - /* we can do this, since the typemap code for char** will - put a NULL at the end of list */ - while (input_setnames[num_input_setnames]) num_input_setnames++; - - if (zebra_begin_read (zh)) - return; - - resultSetSort (zh, stream->mem, num_input_setnames, input_setnames, - output_setname, sort_sequence, &sort_status); - - zebra_end_read(zh); - return (sort_status); -} diff --git a/perl/zebra_perl.c b/perl/zebra_perl.c index 0649bca..7bc2646 100644 --- a/perl/zebra_perl.c +++ b/perl/zebra_perl.c @@ -5,9 +5,12 @@ #include #include +#include +#include +#include + #include "zebra_perl.h" #include -#include NMEM handles; @@ -35,6 +38,236 @@ void logMsg (int level, const char *message) { logf(level, "%s", message); } -void zts_test (ZebraTransactionStatus *stat) { - stat->processed++; +/* debug tool for data1... maybe should be moved to data1. + perl can't really pass filehandles */ +void data1_print_tree(data1_handle dh, data1_node *n) { + data1_pr_tree(dh, n, stdout); } + +/* --------------------------------------------------------------------------- + Record retrieval + 2 phase retrieval - I didn't manage to return array of blessed references + to wrapped structures... it's feasible, but I'll need some time + / pop - 2002-11-17 +*/ + +void record_retrieve(RetrievalObj *ro, + ODR stream, + RetrievalRecord *res, + int pos) +{ + int i = pos - 1; + + + RetrievalRecordBuf *buf = + (RetrievalRecordBuf *) odr_malloc(stream, sizeof(*buf)); + + res->errCode = ro->records[i].errCode; + 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 = (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; + +} + + + +/* most of the code here was copied from yaz-client */ +void records_retrieve(ZebraHandle zh, + ODR stream, + const char *setname, + const char *a_eset, + const char *a_schema, + const char *a_format, + int from, + int to, + RetrievalObj *res) +{ + static enum oid_value recordsyntax = VAL_SUTRS; + static enum oid_value schema = VAL_NONE; + static Z_ElementSetNames *elementSetNames = 0; + static Z_RecordComposition compo; + static Z_ElementSetNames esn; + static char what[100]; + int i; + int oid[OID_SIZE]; + + compo.which = -1; + + if (from < 1) from = 1; + if (from > to) to = from; + res->noOfRecords = to - from + 1; + + res->records = odr_malloc (stream, + sizeof(*res->records) * (res->noOfRecords)); + + for (i = 0; inoOfRecords; i++) res->records[i].position = from+i; + + if (!a_eset || !*a_eset) { + elementSetNames = 0; + } else { + strcpy(what, a_eset); + esn.which = Z_ElementSetNames_generic; + esn.u.generic = what; + elementSetNames = &esn; + } + + if (!a_schema || !*a_schema) { + schema = VAL_NONE; + } else { + schema = oid_getvalbyname (a_schema); + if (schema == VAL_NONE) { + logf(LOG_WARN,"unknown schema '%s'",a_schema); + } + } + + + if (!a_format || !*a_format) { + recordsyntax = VAL_SUTRS; + } else { + recordsyntax = oid_getvalbyname (a_format); + if (recordsyntax == VAL_NONE) { + logf(LOG_WARN,"unknown record syntax '%s', using SUTRS",a_schema); + recordsyntax = VAL_SUTRS; + } + } + + if (schema != VAL_NONE) { + oident prefschema; + + prefschema.proto = PROTO_Z3950; + prefschema.oclass = CLASS_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->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) + { + /* 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; + } + compo.u.complex->num_dbSpecific = 0; + compo.u.complex->dbSpecific = 0; + compo.u.complex->num_recordSyntax = 0; + compo.u.complex->recordSyntax = 0; + } + else if (elementSetNames) { + compo.which = Z_RecordComp_simple; + compo.u.simple = elementSetNames; + } + + if (compo.which == -1) { + api_records_retrieve (zh, stream, setname, + NULL, + recordsyntax, + res->noOfRecords, res->records); + } else { + api_records_retrieve (zh, stream, setname, + &compo, + recordsyntax, + res->noOfRecords, res->records); + } + +} + +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, + const char *pqf_query) +{ + Z_AttributesPlusTerm *zapt; + Odr_oid *attrsetid; + const char* oidname; + oid_value attributeset; + ZebraScanEntry *entries; + int i, class; + + logf(LOG_DEBUG, + "scan req: pos:%d, num:%d, partial:%d", + so->position, so->num_entries, so->is_partial); + + zapt = p_query_scan (stream, PROTO_Z3950, &attrsetid, pqf_query); + + oidname = yaz_z3950oid_to_str (attrsetid, &class); + logf (LOG_DEBUG, "Attributreset: %s", oidname); + attributeset = oid_getvalbyname(oidname); + + if (!zapt) { + logf (LOG_WARN, "bad query %s\n", pqf_query); + odr_reset (stream); + return; + } + + so->entries = (scanEntry *) + odr_malloc (stream, sizeof(so->entries) * (so->num_entries)); + + + zebra_scan (zh, stream, zapt, attributeset, + &so->position, &so->num_entries, + (ZebraScanEntry **) &so->entries, &so->is_partial); + + logf(LOG_DEBUG, + "scan res: pos:%d, num:%d, partial:%d", + so->position, so->num_entries, so->is_partial); +} + +scanEntry *getScanEntry(ScanObj *so, int pos) { + return (&so->entries[pos-1]); +} + diff --git a/perl/zebra_perl.h b/perl/zebra_perl.h index 3a3135c..cae6857 100644 --- a/perl/zebra_perl.h +++ b/perl/zebra_perl.h @@ -2,7 +2,6 @@ #define ZEBRA_PERL_H #include "zebraapi.h" -#include "zebra_api_ext.h" typedef struct { char *groupName; @@ -25,6 +24,12 @@ typedef struct { } RetrievalObj; typedef struct { + char *buf; /* record buffer (void pointer really) */ + int len; /* length */ +} RetrievalRecordBuf; + + +typedef struct { int errCode; /* non-zero if error when fetching this */ char *errString; /* error string */ int position; /* position of record in result set (1,2,..) */ -- 1.7.10.4