Search-Namazu

 view release on metacpan or  search on metacpan

Namazu.xs  view on Meta::CPAN

	fsize = (int *) malloc(sizeof(int) * (flen + 1));
	for (i = 0; i <= flen; i ++) {
		SV **x;
		x = av_fetch(fields, i, 0);
		fstr[i] = SvPV_nolen(*x);
		fsize[i] = SvCUR(*x);
	}
	hlist = nmz_search(query);
	av_extend(retar, hlist.num - 1);
	status = hlist.stat;
	stash = gv_stashpv("Search::Namazu::ResultXS", 0);
	for (i = 0; i < hlist.num; i ++) {
		if (i < maxget) {
			HV *hash;
			SV *ref;
			SV *score, *date, *rank, *docid, *idxid;
			int j;
			char fcont[BUFSIZE];

			hash = newHV();
			for (j = 0; j <= flen; j ++) {
				nmz_get_field_data(hlist.data[i].idxid,
					hlist.data[i].docid,
					fstr[j], fcont);
				hv_store(hash, fstr[j], fsize[j], 
					newSVpv(fcont, strlen(fcont)), 0);
			}
			score = newSViv(hlist.data[i].score);
			date = newSViv(hlist.data[i].date);
			rank = newSViv(hlist.data[i].rank);
			docid = newSViv(hlist.data[i].docid);
			idxid = newSViv(hlist.data[i].idxid);
			hv_store(hash, SCORE, SCORE_LEN, score, 0);
			hv_store(hash, DATE, DATE_LEN, date, 0);
			hv_store(hash, RANK, RANK_LEN, rank, 0);
			hv_store(hash, DOCID, IDXID_LEN, docid, 0);
			hv_store(hash, IDXID, IDXID_LEN, idxid, 0);

			ref = newRV_inc((SV*) hash);
			sv_bless(ref, stash);
			av_store(retar, i, ref);
		} else {
			av_store(retar, i, &PL_sv_undef);
		}
	}
	nmz_free_hlist(hlist);
	free(fstr);
	free(fsize);
	return retar;
}

MODULE = Search::Namazu		PACKAGE = Search::Namazu

PROTOTYPES: DISABLE

void
call_search_main(query, maxget)
	SV *query
	int maxget

	PPCODE:
		char *qstr;
                char buffer[BUFSIZE];
		char cqstr[BUFSIZE * 2];
		AV *retar;
		int i;

		qstr = SvPV(query, PL_na);
                strncpy(buffer, qstr, BUFSIZE);
                buffer[BUFSIZE - 1] = '\0';
		nmz_codeconv_query(buffer);
		strcpy(cqstr, buffer);
		retar = call_search_main_c(cqstr, maxget);
#if ! defined(PERL_VERSION) || (PERL_VERSION == 6 && PERL_SUBVERSION == 0)
		{ /* workaround for only one result */
                        SPAGAIN;
		}
#endif /* PERL_VERSION */
		while (av_len(retar) >= 0) {
			XPUSHs(av_shift(retar));
		}
		nmz_free_internal();

SV*
call_search_main_ref(query, maxget)
	SV *query
	int maxget

	CODE:
		char *qstr;
                char buffer[BUFSIZE];
		char cqstr[BUFSIZE * 2];
		AV *retar;
		int i;

		qstr = SvPV(query, PL_na);
                strncpy(buffer, qstr, BUFSIZE);
                buffer[BUFSIZE - 1] = '\0';
                nmz_codeconv_query(buffer);
                strcpy(cqstr, buffer);
		retar = call_search_main_c(cqstr, maxget);
		nmz_free_internal();
		RETVAL = newRV_inc((SV*) retar);
	OUTPUT:
		RETVAL

SV*
call_search_main_fields(query, maxget, fieldref)
	SV *query
	int maxget
	SV *fieldref

	CODE:
		char *qstr;
                char buffer[BUFSIZE];
		char cqstr[BUFSIZE * 2];
		AV *retar;
		AV *fields;
		int i;

		fields = (AV *) SvRV(fieldref);



( run in 0.397 second using v1.01-cache-2.11-cpan-5511b514fd6 )